0

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

应用概要:

该应用程序将允许用户在 HTML5 画布上创建艺术品并与世界分享。如果人们拥有艺术品的永久链接并有权查看它,他们可以对艺术品发表评论。艺术品的创作者允许该艺术品公开或密码保护。

这是使用工作流程:

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

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

4

1 回答 1

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 驻留在服务层上,代表 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,因为对我来说,这听起来更像是一种功能需求,而不是安全需求。

于 2013-11-13T05:50:17.773 回答