【发布时间】:2018-12-24 06:41:02
【问题描述】:
我正在开发一个 Spring MVC Web 应用程序。我想为特定角色实现 Spring Security。我有三个角色:用户、管理员和客户。
这是我的代码示例:
context-security.xml
<global-method-security
secured-annotations="enabled" proxy-target-class="true">
</global-method-security>
<http pattern="/resources/**" security="none" />
<http pattern="/javax.faces.resource/**" security="none" />
<http pattern="/img/**" security="none" />
<http pattern="/login*" security="none" />
<http auto-config="true" access-denied-page="/accessDenied.xhtml">
<anonymous enabled='false' />
<intercept-url pattern="/login*"
access="IS_AUTHENTICATED_ANONYMOUSLY" />
<intercept-url pattern="/**" access="ROLE_ADMIN" />
<intercept-url pattern="/pages/user**"
access="ROLE_USER" />
<intercept-url pattern="/pages/cutomer**"
access="ROLE_CUSTOMER" />
<form-login login-processing-url="/j_spring_security_check"
login-page="/login.xhtml"
authentication-success-handler-ref="customSuccessHandler"
authentication-failure-url="/login" />
<logout logout-url="/logout" logout-success-url="/login"
invalidate-session="true" delete-cookies="JSESSIONID" />
</http>
<beans:bean id="customAuthenticationProvider"
class="com.invetechs.security.CustomAuthenticationProvider" />
<authentication-manager
alias="authenticationManager">
<authentication-provider
ref="customAuthenticationProvider">
</authentication-provider>
</authentication-manager>
HappyfacesUserDetails
public static final class HappyfacesUserDetails implements UserDetails {
private static final long serialVersionUID = 1L;
/** User. */
private User user;
/** Constructor. */
private HappyfacesUserDetails(User user) {
super();
this.user = user;
}
@Override
public boolean isEnabled() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public String getUsername() {
return user.getUserName();
}
@Override
public String getPassword() {
return user.getPassword();
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
List<GrantedAuthority> roles = new ArrayList<GrantedAuthority>();
roles.add(new GrantedAuthority() {
private static final long serialVersionUID = 1L;
@Override
public String getAuthority() {
if (user.getId() == -1L)
return "ROLE_ADMIN";
else if (user.getId() == 1L )
return "ROLE_CUSTOMER";
else
return "ROLE_USER";
}
});
return roles;
}
public User getUser() {
return user;
}
}
项目目录
更多详情
该项目具有三个主要角色:管理员、用户和客户。每个角色都有权访问目录中的页面,该目录包含来自 Web 应用程序目录的角色名称。例如:用户角色可以访问目录用户内的页面,其他角色也是如此。
在当前情况下,管理员可以访问每个目录,而其他角色无法访问应用程序中的任何内容。
我认为我的问题出在context-security 文件中,但我无法弄清楚问题所在。
【问题讨论】:
-
您的
/**规则是第一个,因此匹配所有内容。定义规则的顺序也是参考它们的顺序!因此,将您的/**作为匹配的最后一条规则,而不是第一条。
标签: spring spring-mvc spring-security