考虑使用User
和Group
的一些基本授权框架,其中应通过检查来保护对方法的访问,以确保用户或组具有必要的PriviledgeLevel
来执行方法,否则失败。
我的想象是这样的:
@AccessCheck(PriviledgeLevel.ADMINISTRATOR)
public static void secureMethod(){ ... }
代码检查基本上是
if(currentUser.getPriviledgeLevel >= PriviledgeLevel.ADMINISTRATOR ||
currentUser.getGroup.priviledgeLevel >= PriviledgeLevel.ADMINISTRATOR)
// Allow access
else
// Deny access
是否有可能以这种方式实施?
我做了一些研究,指出基于AspectJ的一些现有事物,主要是Security Annotation Framework(SAF)和Spring Security。
我有点担心,因为SAF似乎不再活跃,文档也不是很好。
我不确定Spring Security,但似乎更关注网络相关主题中的安全问题。
Java Authentication and Authorization Service似乎是相关的,但不使用注释方法。
尝试使用这种声明方法来定义这些安全要求是否有意义?
我是否缺少另一个图书馆/框架,它已经实现了我想要的或一些与此相关的技术?
或者是否有一个完全不同的解决方案(比如实现我自己的ClassLoader
,...),这比我想象的更好(就图书馆用户的简洁性和可读性而言)?
答案 0 :(得分:1)
您可以通过使用动态代理轻松地完成此操作。
public interface MyInterface {
@AccessCheck(Privilege.ADMIN)
public void doSomething();
}
代理将在实现您的界面的类上创建,您可以使用自定义注释来注释您的界面。
MyInterface aInterface = (MyInterface) java.lang.reflect.Proxy.newProxyInstance(obj.getClass()
.getClassLoader(), obj.getClass().getInterfaces(),
new YourProxy(new Implementation());
在代理的invoke()方法中,您可以检查您的方法是否具有注释,并在未满足特权时抛出SecurityException。
public YourProxy implements InvocationHandler {
....
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if ( method.isAnnotationPresent(AccessCheck.class) {
....// do access check here and throw SecurityException()
}
}
答案 1 :(得分:1)
我认为AspectJ会做你想做的事。我们有一大堆方法,你需要某些访问权限,我们已经创建了一个AspectJ方面,如果用户没有这些权限,它会检查并出错。
作为一个优点,因为AspectJ在编译时被“编织”到类中,所以不能通过配置禁用它。
我们也使用Spring Security,可以和谐地使用它们!
答案 2 :(得分:1)
使用Spring Security,您只需添加:
@Secured("ADMINISTRATOR")
public static void secureMethod(){ ... }
通过以下方式正确配置:
JdbcDaoImpl
作为UserDetailsService
如果您不使用数据库凭据存储,只需配置首选UserDetailsService
即可将用户和组凭据添加到生成的UserDetails
的权限中。
但是,如果没有检查documentation的概念就很难理解它,但是弹簧安全性完全可以实现方法级访问检查,而且这是我首选的技术。
答案 3 :(得分:0)
在Spring Security中,the docs状态,@Secured
和@PreAuthorize
都可以在方法级别使用。
要启用@PreAuthorize
(如果您还没有...),则需要<global-method-security pre-post-annotations="enabled" />
在您的配置XML中;
@Secured
使用<global-method-security secured-annotations="enabled" />
。
有关详细信息,请参阅this article。