春季安全动态角色

时间:2017-04-19 08:15:33

标签: spring-mvc spring-security

我正在开发spring mvc和spring security项目。在我们的项目中,角色和权限将存储在db中,并且存在不同的角色。我在下面写了限制访问权限的代码,但所有网址都适用于所有网址,请帮助我根据授权机构限制用户。

的security.xml

<http use-expressions="true" >
        <intercept-url pattern="/**" access="isAuthenticated()"/>
        <form-login  login-page="/login.jsp" 
                     login-processing-url="/login"
                     username-parameter="userName"
                     password-parameter="password"
                     authentication-success-handler-ref="authenticationSuccessHandler"
                     authentication-failure-handler-ref="authenticationFailedHandler"
                     />
        <logout logout-url="/logout" invalidate-session="true" logout-success-url="/login.jsp?logout=true"/>
        <access-denied-handler error-page="/accessDenied"/>
    </http>

自定义身份验证提供程序

List<GrantedAuthority> AUTHORITIES = new ArrayList<GrantedAuthority>();
    if(userName.equals("admin")){
        System.out.println("++++++ admin user +++++");
        AUTHORITIES.add(new SimpleGrantedAuthority("/hello"));
        AUTHORITIES.add(new SimpleGrantedAuthority("/hello1"));
        AUTHORITIES.add(new SimpleGrantedAuthority("/hello2"));
    }else{
        AUTHORITIES.add(new SimpleGrantedAuthority("/hello"));
        AUTHORITIES.add(new SimpleGrantedAuthority("/hello1"));
    }
    return new UsernamePasswordAuthenticationToken(userName,null,AUTHORITIES);

在上面的示例中,现在所有用户都可以访问所有网址,但请帮助限制他们仅访问授予他的网址。

1 个答案:

答案 0 :(得分:0)

试试这个,

<http use-expressions="true" >
    <intercept-url pattern="/**" access="hasRole('ROLE_USER') or hasRole('ROLE_ADMIN') or hasRole('ROLE_MYCUSTOMROLE')"/>
    <form-login  login-page="/login.jsp" 
                 login-processing-url="/login"
                 username-parameter="userName"
                 password-parameter="password"
                 authentication-success-handler-  ref="authenticationSuccessHandler"
                 authentication-failure-handler-  ref="authenticationFailedHandler"
                 />
    <logout logout-url="/logout" invalidate-session="true" logout-success-url="/login.jsp?logout=true"/>
    <access-denied-handler error-page="/accessDenied"/>
</http>

注1:为了清晰起见,使用安全名称空间,访问属性应该有一些角色而不是url

而不是将URl传递给GrantedAuthority传递一些角色,即使您可以做得更好,只需创建一个User pojo类并实现UserDetails,这样就可以避免大量的样板代码。