使用Spring Security的Spring MVC应用程序所需的设计,身份验证和授权策略

时间:2013-11-11 21:05:57

标签: spring jsp servlets spring-mvc spring-security

我正在学习Spring-MVC和Spring-security。我决定创建一个可以练习概念的项目。我需要帮助的是提出一种授权和验证我的用户的策略。您可以参考的任何示例或您可以提供给我的想法对我的设计都非常有帮助。

应用概要:

  

该应用程序将允许用户像HTML5一样创建艺术作品   画布并与世界分享。人们可以评论艺术品   如果他们有永久链接并且有权看到它。该   艺术品的创作者允许这种艺术是公共的或密码   安全

以下是使用工作流程:

  

用户登录
   - >指向包含列表的个人资料页面   几件艺术品
- >用户可以选择编辑或删除现有艺术品。
- >   用户还可以创建新的艺术。
每件艺术品都应该有一个永久链接   用户可以通过公开或密码保护/公开与世界分享。

我不知道从哪里开始设计这个东西,因为我是一个新手。在设计/构建此应用程序方面,有人可以提供有关如何处理此用例的建议吗?

1 个答案:

答案 0 :(得分:0)

考虑到这些要求,我不太了解Spring Security设计,可以使用或多或少的基本Spring Security配置轻松管理。 对于身份验证部分,我将使用实现UserDetails和UserDetailsS​​ervice接口,即创建自定义身份验证提供程序。 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的结果,也是验证工作正常所必需的。

UserDetailsS​​ervice驻留在服务层上,表示与UserDetails对象一起使用的身份验证提供程序的Spring Security兼容实现:

@Service
public class UserServiceImpl implements UserService, UserDetailsService {
    …

    @Override
    @Transactional(readOnly=true)
    public UserDetails loadUserByUsername(String username) {
        return userDao.getUserByUsername(username);
    }
}

您也可以将其与您的服务结合使用,例如与应用程序用户实体合作。该示例意味着使用DAO来获取依赖于持久性框架的UserDetails对象。

关于使用密码保护图像我不会使用Spring Security,因为对我来说这听起来更像是功能要求而不是安全性要求。