Spring Security为什么新创建的用户无法查看受保护的页面?

时间:2014-10-04 20:05:58

标签: grails spring-security

使用Grails 2.4.3和Spring Security RC4。除了在BootStrap.groovy中创建的用户之外,任何其他用户(通过浏览器创建的用户)都无法访问指定的控制器。我有以下控制器可供访问:

package org.example
import grails.plugin.springsecurity.annotation.Secured

class SecureController {

    @Secured(['ROLE_USER'])
    def index() {
        render 'hello'
    }
}

在BootStrap中:

def adminRole = new SecRole(authority: 'ROLE_ADMIN').save(flush: true)
def userRole = new SecRole(authority: 'ROLE_USER').save(flush: true)

def testUser = new SecUser(username: 'me', password: 'password')
testUser.save(flush: true)

SecUserSecRole.create testUser, adminRole, true

def teUser = new SecUser(username: 'me2', password: '123')
teUser.save(flush: true)
SecUserSecRole.create teUser, userRole, true

我的Config.groovy:

grails.plugin.springsecurity.userLookup.userDomainClassName = 'org.example.SecUser'
grails.plugin.springsecurity.userLookup.authorityJoinClassName = 'org.example.SecUserSecRole'
grails.plugin.springsecurity.authority.className = 'org.example.SecRole'
grails.plugin.springsecurity.logout.postOnly = false
grails.plugin.springsecurity.controllerAnnotations.staticRules = [
    '/':                              ['permitAll'],
    '/**':                            ['permitAll']

我在我的SecUser上使用了generate-all命令在运行时创建新用户..但是创建的所有用户都无法访问SecureController,我得到:“抱歉,您无权查看此页面。 “ 任何想法?

2 个答案:

答案 0 :(得分:2)

如果用户存在并且具有正确的分配角色,则不会自动使该实例成为登录用户。他们需要进入登录页面并进行身份验证。如果您愿意,只要您确信数据一致并且正确的身份验证成功,您就可以在保留域类实例后对其进行自动身份验证。请使用reauthenticate中的springSecurityService方法。

这适用于登录用户更改在Authentication实例中缓存的内容的情况,该实例是Spring安全存储在ThreadLocal中以在请求期间跟踪其数据(例如,角色,用户名和任何额外的缓存,就像他们的真实姓名一样,等等。)例如,如果您授予新角色,您可能希望更新Spring Security使用的角色列表,以便他们可以访问新访问的页面请求和所有其他请求,直到他们再次进行身份验证通过强制执行新的Authentication,以及稍后再次登录时,您将读取数据库中的所有数据(包括这些更改)并最终获得相同的数据。因此,您可以利用这种方便的方法来自动验证当前用户。

像自动身份验证一样方便(我经常认为重新输入我刚刚在网站上注册的用户名和密码似乎有点傻),让它们明确登录更安全。如果有任何关闭并且后续登录失败,您希望尽快发生。

答案 1 :(得分:1)

这是我根据你的评论给出的答案(两周前我遇到了同样的问题,可能你的情况也一样)。

正如您在Bootstrap中所看到的,创建用户并附加角色需要两个步骤:

首先,创建一个新用户:

def testUser = new SecUser(username: 'me', password: 'password')

其次,将角色附加到用户:

SecUserSecRole.create teUser, userRole, true

没有添加“默认角色”。在创建用户之后,您可能需要添加类似的内容:

def role = SecRole.findByAuthority('ROLE_USER')
SecUserSecRole.create user, role, true

希望有所帮助