在我的基于Spring的应用程序中,我目前有基本角色,例如ADMIN和USER。
是否可以定义从USER继承的用户角色,例如PHOTO_UPLOADER,还可以检查进行调用的用户是否实际上是照片的所有者?
我厌倦了一遍又一遍地在我的控制器动作中编写相同的if (currentUser.id == photo.uploader.id)
。它也适用于其他实体。
答案 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)