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 上的通配符。 改变这个

&lt;intercept-url pattern="/admin**" access="hasRole('SUPER_ADMIN')" /&gt;

&lt;intercept-url pattern="/admin/**" access="hasRole('SUPER_ADMIN')" /&gt;

不知道为什么以及如何,但 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