Grail的Spring安全性:使用电子邮件而不是用户名在SwitchUserFilter中切换用户

时间:2015-08-05 14:45:48

标签: grails spring-security

我的spring security中有一个修改过的User类,它使用属性email而不是username。现在我想要一个切换用户的功能,因此管理员可以作为特定用户无缝登录而无需注销。我遇到了这个Link,它显示有一个switchUserFilter来实现这一点。所以我尝试通过将j_username作为电子邮件传递来使其工作,但它被重定向到空白页面并且用户不切换。

我已经尝试了所有这些东西,但仍然无法找到解决方法: 1)添加到Config.groovy: grails.plugins.springsecurity.userLookup.usernamePropertyName='email'

2)在User class getUserName()中创建一个方法以返回电子邮件。

P.S:我查看了springSecurity switchUserFilter(link)的源代码,并在第209行遇到了这段代码:

protected Authentication attemptSwitchUser(HttpServletRequest request)
        throws AuthenticationException {
    UsernamePasswordAuthenticationToken targetUserRequest;

    String username = request.getParameter(usernameParameter);

但我不确定这是不是问题,也不想在插件中进行更改。

2 个答案:

答案 0 :(得分:1)

默认情况下,SwitchUserFilter的 usernameParameter 属性设置为 username 。这似乎是你问题的一部分。

SwitchUserFilter有一个名为setUsernameParameter()的方法,允许您更改此默认值。过滤器似乎是一个bean,所以你可以在 grails-app / conf / spring / Config.groovy

中做这样的事情。
def switchUserFilter

def init = { servletContext ->
        switchUserFilter.usernameParameter = 'email'
}

或者在grails-app / config / BootStrap.groovy

中可能是这样的
{{1}}

答案 1 :(得分:0)

终于找到了解决方案:将其添加到config.groovy文件

grails.plugin.springsecurity.userLookup.usernamePropertyName = 'email'
    grails.plugin.springsecurity.useSwitchUserFilter = true

    grails.plugin.springsecurity.controllerAnnotations.staticRules = [
    ....
    '/j_spring_security_switch_user': ['ROLE_SWITCH_USER', 'isFullyAuthenticated()'],
    '/j_spring_security_exit_user': ['isFullyAuthenticated()'],
    '/public/**':              ['permitAll']
    .....
    ]

2)然后在bootstrap.groovy中创建一个角色ROLE_SWITCH_USER

def switchUserRole = Role.findByAuthority('ROLE_SWITCH_USER') ?: new Role(authority: 'ROLE_SWITCH_USER').save(flush: true, failOnError: true)

并将其分配给超级用户

3)然后按照说明(here)更新视图以添加切换按钮