我正在开发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);
在上面的示例中,现在所有用户都可以访问所有网址,但请帮助限制他们仅访问授予他的网址。
答案 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,这样就可以避免大量的样板代码。