从需求来看,我看不到太多 Spring Security 设计,这可以通过或多或少的基本 Spring Security 配置轻松管理。对于身份验证部分,我将实施 UserDetails 和 UserDetailsService 接口,即创建自定义身份验证提供程序。UserDetails 涵盖了表示该层上 Spring Security 感知实体的域模型逻辑。这通常与应用程序用户实体结合使用,如下所示:
@Entity
@Table(name="APP_USER")
public class User implements Serializable, UserDetails {
@Id
@Column(name="ID")
private Long id;
@Column(name="IS_ACTIVE", nullable=false)
private Boolean isActive;
@Column(name="USERNAME", nullable=false, unique=true)
private String username;
@Column(name="PASSWORD", nullable=false)
private String password;
…
@Override
public String getPassword() {
return password;
}
@Override
public boolean isEnabled() {
return isActive;
}
@Override
public boolean isCredentialsNonExpired() {
return isActive;
}
@Override
public boolean isAccountNonLocked() {
return isActive;
}
@Override
public boolean isAccountNonExpired() {
return isActive;
}
@Override
public Set<GrantedAuthority> getAuthorities() {
Set<GrantedAuthority> authorities = new HashSet<GrantedAuthority>();
authorities.add(new SimpleGrantedAuthority("ROLE_USER"));
return authorities;
}
}
请注意许多重写的方法,这是实现 UserDetails 的结果,并且需要身份验证才能正常工作。
UserDetailsService 驻留在服务层上,代表 Spring Security 兼容的身份验证提供程序实现,它与 UserDetails 对象一起使用:
@Service
public class UserServiceImpl implements UserService, UserDetailsService {
…
@Override
@Transactional(readOnly=true)
public UserDetails loadUserByUsername(String username) {
return userDao.getUserByUsername(username);
}
}
在这里,您也可以自由地将它与您的服务结合起来,例如使用应用程序用户实体。该示例暗示使用 DAO 来获取取决于您的持久性框架的 UserDetails 对象。
关于使用密码保护图像,我不会为此使用 Spring Security,因为对我来说,这听起来更像是一种功能需求,而不是安全需求。