使用hibernate的Spring Security:hasRole()在config中不起作用

时间:2015-12-11 18:39:09

标签: spring hibernate spring-mvc spring-security

我正在尝试为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(拒绝访问)。

我错过了什么吗?请帮忙。!

2 个答案:

答案 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提示。 :)