春季安全动态角色

Posted

技术标签:

【中文标题】春季安全动态角色【英文标题】:spring security dynamic roles 【发布时间】:2017-09-15 08:28:37 【问题描述】:

我正在从事 spring mvc 和 spring 安全项目。在我们的项目中,角色和权限将存储在 db 中,并且那里有不同的角色。我写了下面的代码来限制访问,但是所有的 URL 都对他们有用,请帮助我根据他们的授予权限来限制用户。

安全性.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);

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

【问题讨论】:

请阅读spring securitydocs.spring.io/spring-security/site/docs/4.0.3.RELEASE/…的文档。 SimpleGrantedAuthority 应该扮演一个角色而不是一个 URL。尝试解决这个问题。我也建议你看看这里:baeldung.com/security-spring 【参考方案1】:

试试这个,

<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 这样您就可以避免大量样板代码。

【讨论】:

以上是关于春季安全动态角色的主要内容,如果未能解决你的问题,请参考以下文章

OpenLDAP 中的动态组问题

如何处理 Spring 安全中的动态角色变化?

SSAS OLAP 多维数据集动态安全性。一个角色中的多个维度

春季安全单点登录浏览器

动态创建作业的春季批处理测试

在 Spring Data rest json Response 中动态过滤实体字段