如何使 Grails Spring Security 2.0 中的登录/页面成为初始屏幕?

Posted

技术标签:

【中文标题】如何使 Grails Spring Security 2.0 中的登录/页面成为初始屏幕?【英文标题】:How to make the login/ page in Grails Spring Security 2.0 the inital screen? 【发布时间】:2014-01-09 18:52:53 【问题描述】:

我正在从 grails 2.2.2 迁移到 grails 2.3.4 以避免 2.2.2 中的错误,即 spring 安全属性消息中的文本值未显示,但我遇到了各种问题。以前有用的东西,现在不行了。

问题

当我运行 grails 应用程序时,初始默认页面是 index.gsp,这是标准功能,但在安装和配置 spring security core、spring security ldap 和 spring securiy ui 插件之后,我会喜欢将 /login/auth 设为我的默认页面。

在之前的版本中,我通过 UrlMappings.groovy 配置文件通过简单地注释、替换或删除这一行来完成它

"/"(view:"/index")

为了这个

"/"(view:"/login/auth")

我的 Config.groovy 已设置,如果身份验证成功将我带到主页

grails.plugin.springsecurity.userLookup.userDomainClassName = 'security.Person'
grails.plugin.springsecurity.userLookup.authorityJoinClassName = 'security.PersonAuthority'
grails.plugin.springsecurity.authority.className = 'security.Authority'
grails.plugin.springsecurity.requestMap.className = 'security.Requestmap'
grails.plugin.springsecurity.securityConfigType = 'Requestmap'
grails.plugin.springsecurity.successHandler.defaultTargetUrl = '/home/'

以及我在 Bootstrap 中的 Requestmap 条目(如果它们对这个问题有任何重要性,如下所示):

for (String url in [
        '/', '/index', '/index.gsp', '/**/favicon.ico',
        '/**/js/**', '/**/css/**', '/**/images/**',
        '/login', '/login.*', '/login/*',
        '/logout', '/logout.*', '/logout/*']) 
     new Requestmap(url: url, configAttribute: 'permitAll').save()
  

  new Requestmap(url: '/home/*', configAttribute: 'IS_AUTHENTICATED_FULLY').save()

事实证明,当我这样做时...... Eureka login/auth 在应用程序启动后立即出现,但是当我输入正确的身份验证凭据时,它似乎没有进行身份验证,它确实会“轻微闪烁”并再次显示。

但是,如果我删除这一行

"/"(view:"/login/auth")

把这个放回去

 "/"(view:"/index")

然后当我重新启动应用程序时,我手动 login/auth 并输入正确的凭据,然后它会正确地将我带到主页。

问题

    我是否遗漏了任何可以使 login/auth 成为首页(但也允许我进行身份验证)的配置设置?

    我不确定这是否应该是单独发布的问题,但现在通过设计登录页面,它是插件的一部分,在它由我的代码生成之前,它是我的代码的一部分,我可以随意设置样式。我是否必须在我的应用中复制粘贴 LoginControllerAuth.gsp 才能自定义视图,还是有更好的首选方法?

    李>

提前致谢。

【问题讨论】:

【参考方案1】:

Spring Security 中的身份验证机制通过在显示登录页面时跟踪引用 URL 来工作。然后在成功登录时重定向到此页面。如果您希望登录页面成为人们看到的第一页,只需使根视图需要身份验证。我假设大多数(如果不是全部)您的应用程序都需要身份验证。如果是这种情况,您不需要将登录页面设置为根视图。假设/home/* 下的所有内容都被锁定,那么 Spring Security 将检测到这一点,并在请求任何安全页面时立即重定向到登录页面。

长话短说,你让它变得比需要的更难。

关于你的第二个问题,我相信你只需要在你的应用中创建你自己版本的这些文件来自定义它们。

【讨论】:

当你说“Spring Security 通过跟踪引用 URL 来工作”时,你点亮了一个灯泡。我可以通过在视图和我自己的 auth.gsp 下创建一个登录文件夹来自定义登录屏幕。无需将 LoginController 复制到我的代码库中 谢谢,“Spring Security 通过跟踪引用 URL 来工作”帮助我找出了我的应用程序的问题。登录页面不断重定向到默认页面上的 javascript 调用的 URL,在用户通过链接进入登录页面之前显示该 URL。原来这个 URL 不能被脚本访问,因为它受到 Spring Security 的保护;大概是在失败的尝试中,Spring Security 记住了登录后的 URL。根据您的提示,我将该 URL 添加到无需登录即可访问的页面列表中。现在一切顺利。【参考方案2】:

嘿,我不太确定您的问题,但您可以尝试通过

设置默认登录网址 /login/auth
grails.plugin.springsecurity.auth.loginFormUrl = '/login/auth'

【讨论】:

以上是关于如何使 Grails Spring Security 2.0 中的登录/页面成为初始屏幕?的主要内容,如果未能解决你的问题,请参考以下文章

使用带有令牌的 spring 安全插件的一个好习惯

grails spring安全休息插件

Grails,Spring Security LDAP 插件

Spring 3.0 - 无法找到 XML 模式命名空间的 Spring NamespaceHandler [http://www.springframework.org/schema/securit

Spring 3.0 - 无法找到 XML 模式命名空间的 Spring NamespaceHandler [http://www.springframework.org/schema/securit

来自服务的 Grails Spring Security 身份验证