根据Spring Security中的某种所有权设置用户角色

时间:2012-02-29 08:28:19

标签: spring spring-security roles

在我的基于Spring的应用程序中,我目前有基本角色,例如ADMIN和USER。

是否可以定义从USER继承的用户角色,例如PHOTO_UPLOADER,还可以检查进行调用的用户是否实际上是照片的所有者?

我厌倦了一遍又一遍地在我的控制器动作中编写相同的if (currentUser.id == photo.uploader.id)。它也适用于其他实体。

3 个答案:

答案 0 :(得分:11)

您可以使用像Tomasz Nurkiewicz建议的ACL来处理它。但Spring Securitz ACL很复杂,记录很差。 (我所知道的最好的资源是本书:Spring Security 3 - Spring Security的作者)

但是如果你真的只需要这个简单的if (currentUser.id == photo.uploader.id)测试,那么我会推荐另一种技术。

可以增强您可以在@PreAuthorize注释中使用它们的方法安全表达式。像:

@PreAuthorize("isPhotoOwner(#photo)")
public void doSomething(final Photo photo) {

要实现这样的表达式isPhotoOwner,核心非常简单:

public class ExtendedMethodSecurityExpressionRoot extends MethodSecurityExpressionRoot {

    public ExtendedMethodSecurityExpressionRoot(final Authentication a) {
        super(a);
    }

    /**
     * 
     */
    public boolean isPhotoOwner(final Photo photoObject) {
        if (photoObject == null) {
            return false;
        }

        Photo photo = (photo) photoObject;
        return photo.getCreator().getLogin().equals(authentication.getName());
    }
}

不幸的是,注册ExtendedMethodSecurityExpressionRoot还有一些额外的工作要做。 --- 我现在没有时间,如果你愿意尝试这种方法,然后留下一份意见,我将描述其余的

答案 1 :(得分:1)

我不知道您正在使用哪种类型的数据访问技术。我知道你可以编写拦截器或事件监听器来进行hibernate的安全检查。我认为ibatis也是一样的。在我的项目中,我在父模型/实体类中编写了CRUD启用接口方法,并在某些事件中进行安全检查,例如在实体加载之前。 spring security acl有点复杂。实施安全解决方案更好。

答案 2 :(得分:0)

欢迎来到ACLs - 访问控制列表的世界。 This教程相当古老但非常全面。