如何在spring中编写/检查auth的权限

时间:2014-11-13 14:16:05

标签: java spring spring-mvc spring-security aspectj

我有这样的数据库:

Users <-> Roles -> Permissions

在Spring中我使用spring security登录 - 我不会检查用户的角色。每个人都应该登录。

<authentication-manager alias="authenticationManager">
    <authentication-provider>
       <password-encoder  hash="bcrypt"/>
        <jdbc-user-service data-source-ref="dataSource"
            users-by-username-query="select NAME, PASSWORD, 1 as enabled from USERS 
                                     where NAME=?"
            authorities-by-username-query="SELECT * FROM USERS u JOIN USERS_MTM_ROLES uur
                                            ON u.ID=uur.ROLE_ID join USER_ROLES ur 
                                            on  ur.id=uur.role_id  where NAME=?" />
    </authentication-provider>

<http auto-config="true" use-expressions="true">
    <intercept-url pattern="/admin**" />
    <form-login login-page="/login" default-target-url="/admin"
        authentication-failure-url="/login?error" username-parameter="NAME"
        password-parameter="PASSWORD"  />
    <logout logout-success-url="/login?logout" />
</http>

一切都很好!

但是知道,我想使用@Secure或@Preauthorize注释,以检查用户是否拥有该权限。但是春天怎么会知道用户是否具有具体的权限?应该在某处写入权限吗?

换句话说,我希望我的控制器安全。如果用户具有具体权限,则他/她应该有权访问控制器,否则用户不应该访问。我应该怎么做?

2 个答案:

答案 0 :(得分:1)

Spring Security提供控制器授权的注释。这是一个例子: http://www.mkyong.com/spring-security/spring-security-hello-world-annotation-example/

另外,我强烈建议您使用Shiro而不是Spring Security。在实践中,我意识到配置Spring Security远比它的价值复杂。请参阅http://shiro.apache.org

答案 1 :(得分:1)

如果要对hasPermission使用@PreAuthorize语法,则需要权限评估程序。 Spring Security中有两个内置,deny-all和ACL。您想要的可能是您自己的,实现PermissionEvaluator界面。

然后将您的权限评估程序的实例放在表达式处理程序中:

@Autowired
private PermissionEvaluator permissionEvaluator;

@Bean
public DefaultMethodSecurityExpressionHandler expressionHandler() {
    DefaultMethodSecurityExpressionHandler handler = new DefaultMethodSecurityExpressionHandler();
    handler.setPermissionEvaluator(permissionEvaluator);
    return handler;
}

到您的安全配置:

<global-method-security pre-post-annotations="enabled" secured-annotations="enabled">
  <expression-handler ref="expressionHandler" />
</global-method-security>