是否可以使用注释实现方法级访问检查?

时间:2011-07-08 15:31:07

标签: java security spring annotations spring-security

考虑使用UserGroup的一些基本授权框架,其中应通过检查来保护对方法的访问,以确保用户或组具有必要的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,...),这比我想象的更好(就图书馆用户的简洁性和可读性而言)?

4 个答案:

答案 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(){ ... }

通过以下方式正确配置:

  1. 使用JdbcDaoImpl作为UserDetailsService
  2. enable group support
  3. 自定义查询(如果您使用的是数据库凭据存储)
  4. 如果您不使用数据库凭据存储,只需配置首选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