我正在尝试为Spring + Hibernate项目实现Spring Security。
但我在intercept-url标签中写的hasRole('SUPER_ADMIN')无效。
请找到我在下面完成的配置。
springSecurity.xml
<http auto-config="true" use-expressions="true">
<intercept-url pattern="/admin**" access="hasRole('SUPER_ADMIN')" />
<!-- access denied page -->
<access-denied-handler error-page="/403" />
<form-login login-page="/login" default-target-url="/welcome" authentication-failure-url="/login?error" username-parameter="username"
login-processing-url="/loginCheck" password-parameter="password" />
<logout logout-success-url="/login?logout" />
<!-- enable csrf protection -->
<csrf />
</http>
<authentication-manager>
<authentication-provider user-service-ref="myUserDetailsServices">
<password-encoder hash="bcrypt" />
</authentication-provider>
</authentication-manager>
我正在使用以下身份验证提供程序
public class MyUserDetailsServices implements UserDetailsService {
private UserDao userDao;
@Override
@Transactional
public UserDetails loadUserByUsername(final String username) throws UsernameNotFoundException {
User user = userDao.findByEmail(username);
if (user == null) {
throw new UsernameNotFoundException("User " + username + " not found");
}
List<GrantedAuthority> authorities = buildUserAuthority(user.getRoles());
return buildUserForAuthentication(user, authorities);
}
private org.springframework.security.core.userdetails.User buildUserForAuthentication(User user, List<GrantedAuthority> authorities) {
return new org.springframework.security.core.userdetails.User(user.getEmail(), user.getPassword(), true, true, true, true, authorities);
}
private List<GrantedAuthority> buildUserAuthority(Set<Role> userRoles) {
Set<GrantedAuthority> setAuths = new HashSet<GrantedAuthority>();
for (Role userRole : userRoles) {
setAuths.add(new SimpleGrantedAuthority(userRole.getRoleName()));
}
List<GrantedAuthority> Result = new ArrayList<GrantedAuthority>(setAuths);
return Result;
}
public UserDao getUserDao() {
return userDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}
上面的代码工作正常。我能够获得正确的角色,并返回buildUserForAuthentication()方法,并在权限中添加SUPER_ADMIN角色。
但仍然是hasRole('SUPER_ADMIN')无效。我无法访问页面http://127.0.0.1:8080/myproj/admin。用户正在通过身份验证并登录。但上面的URL被重定向到/ 403(拒绝访问)。
我错过了什么吗?请帮忙。!
答案 0 :(得分:2)
hasRole
运作良好。你的代码中没有的是你的springSecurity.xml上的通配符。
改变这个
<intercept-url pattern="/admin**" access="hasRole('SUPER_ADMIN')" />
到
<intercept-url pattern="/admin/**" access="hasRole('SUPER_ADMIN')" />
不确定原因和方法,但是春天似乎为验证你的网址添加了一个主要的斜线。
因此/admin/**
具有与预期/admin**
相同的效果。
答案 1 :(得分:1)
通过添加&#39; ROLE _&#39;来解决这个问题。到角色名称。将其设为ROLE_SUPER_ADMIN并开始工作。我假设每个角色都应该以&#39; ROLE _&#39;为前缀。使春季安全工作正常。
感谢@storm_buster提示。 :)