春季安全动态角色
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 这样您就可以避免大量样板代码。
【讨论】:
以上是关于春季安全动态角色的主要内容,如果未能解决你的问题,请参考以下文章