Spring Security with hibernate:hasRole() 在配置中不起作用
Posted
技术标签:
【中文标题】Spring Security with hibernate:hasRole() 在配置中不起作用【英文标题】:Spring Security with hibernate : hasRole() is not working in config 【发布时间】:2016-03-17 18:26:28 【问题描述】:我正在尝试为我的 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(拒绝访问)。
我错过了什么吗?请帮忙!
【问题讨论】:
【参考方案1】:hasRole
运行良好。在您的代码中不起作用的是您在 springSecurity.xml 上的通配符。
改变这个
<intercept-url pattern="/admin**" access="hasRole('SUPER_ADMIN')" />
到
<intercept-url pattern="/admin/**" access="hasRole('SUPER_ADMIN')" />
不知道为什么以及如何,但 spring 似乎添加了一个前导斜杠,为什么要验证您的 url。
因此拥有/admin/**
将具有与您预期的/admin**
相同的效果。
【讨论】:
嗨@storm_blaster,我也试过了,但不幸的是这也不起作用。 :( 它应该可以工作。看,要排除是否是导致错误的模式,您可以将访问方法更改为 isAuthenticated() 例如。如果您没有收到 403,则表示您的角色有问题。可能正在检查 ROLE_SUPER_ADMIN 非常感谢您的帮助。在 SUPER_ADMIN 前面添加“ROLE_”有效。我假设每个春季角色都应该以“ROLE_”开头。没有专家认为这是强制性的。所以从来没有尝试过这个选项。 :) 有设置,设置前缀。不记得是哪一个了,得去文档里找。但我肯定在那里读到过。【参考方案2】:通过在角色名称中添加“ROLE_”来解决此问题。将其设置为 ROLE_SUPER_ADMIN 并开始工作。我假设每个角色都应该以“ROLE_”为前缀,以便 Spring Security 正常工作。
感谢@storm_buster 的提示。 :)
【讨论】:
如果storm_buster 帮助您解决了这个问题,那么赞成或接受(打勾)他或她的回答是一个很好的姿态吗?以上是关于Spring Security with hibernate:hasRole() 在配置中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Spring Security with Hibernate,存储加密密码
spring 3.1 with hibernate 4 with spring security 3.1:如何确保包含所有依赖项以及要包含哪些标签?
Spring Boot & Security with AngularJS 登录页面
Spring Data Rest with Spring Security - 按当前用户查找所有内容
Spring security Basic Authentication - 401 Unauthorized with correct credentials
How to use JDBC-Authentication of Spring Boot/Spring Security with Flyway