Grails,Spring安全核心-从应用程序中删除/login/auth

Grails,Spring安全核心-从应用程序中删除/login/auth,grails,spring-security,Grails,Spring Security,我在Grails应用程序中安装了springsecuritycore,并使用s2 quickstart进行了设置。我希望“/”处理登录和注销操作。对我来说,这意味着未登录的用户只能访问根页面,而不能访问其他页面。实际上,除了“/”之外的所有内容都应该对没有角色“role\u ADMIN”的用户进行阻止 我在根页面上添加了登录表单,并在Config.groovy中设置了以下配置: grails.plugin.springsecurity.auth.loginFormUrl = '/' grails

我在Grails应用程序中安装了springsecuritycore,并使用
s2 quickstart
进行了设置。我希望“/”处理登录和注销操作。对我来说,这意味着未登录的用户只能访问根页面,而不能访问其他页面。实际上,除了“/”之外的所有内容都应该对没有角色“role\u ADMIN”的用户进行阻止

我在根页面上添加了登录表单,并在Config.groovy中设置了以下配置:

grails.plugin.springsecurity.auth.loginFormUrl = '/'
grails.plugin.springsecurity.auth.ajaxLoginFormUrl = '/'
grails.plugin.springsecurity.failureHandler.defaultFailureUrl = '/'
grails.plugin.springsecurity.failureHandler.ajaxAuthFailUrl = '/'
grails.plugin.springsecurity.logout.postOnly = false
grails.plugin.springsecurity.userLookup.userDomainClassName = 'adminpanel.security.SecUser'
grails.plugin.springsecurity.userLookup.authorityJoinClassName = 'adminpanel.security.SecUserSecRole'
grails.plugin.springsecurity.authority.className = 'adminpanel.security.SecRole'
grails.plugin.springsecurity.controllerAnnotations.staticRules = [
    '/':                              ['permitAll'],
    '/index':                         ['permitAll'],
    '/index.gsp':                     ['permitAll'],
    '/**/js/**':                      ['permitAll'],
    '/**/css/**':                     ['permitAll'],
    '/**/images/**':                  ['permitAll'],
    '/**/favicon.ico':                ['permitAll']
]
我在我的每个控制器上设置了
@Secured(['ROLE\u ADMIN'])
,并在我的index.gsp中添加了类似的内容:

<head>
    <sec:ifAllGranted roles="ROLE_ADMIN">
        <meta name="layout" content="main"/>
    </sec:ifAllGranted>
    <sec:ifNotGranted roles="ROLE_ADMIN">
        <meta name="layout" content="login"/>
    </sec:ifNotGranted>
    <title>Home Page - Admin Panel</title>
</head>

主页-管理面板
有两个问题:

  • 配置工作与我预期的一样,但是当我在浏览器中键入:
    localhost:8080/AdminPanel/login/auth
    时,页面仍然存在,即使是注销的用户,我也可以访问它。我想完全删除这个URL,无论是登录还是注销的用户都不能访问它

  • 即使用户已注销,
    /login/auth
    视图也会使用
    “main”
    布局呈现,尽管我在index.gsp中有上面提到的代码,这应该会将布局更改为
    “login”
    。为什么?


  • 提前谢谢

    /login/auth
    之所以有效,是因为UrlMappings中的
    “/$controller/$action?/$id?”
    映射。因此,所有控制器都自动映射。一个选项是删除它,但这意味着您必须显式映射所有控制器。这有好处,grails.org应用程序使用这种方法

    您不能取消映射一个自动映射的控制器,但是您可以将它重新映射到发送404的某个对象,这对用户来说是相同的。一种方法是使用Grails过滤器,例如运行
    Grails创建过滤器站点
    ,并将其放入
    SiteFilters中。groovy

    package com.foo.bar
    
    class SiteFilters {
    
       def filters = {
          loginUnmap(uri: '/login/**') {
             before = {
                response.status = 404
                false
             }
          }
       }
    }
    

    我不是100%确定布局问题,但我认为问题在于元标记是由SiteMesh专门处理的。对页面进行分析以确定要使用的布局,然后GSP的一部分被合并到布局中,因此使用运行时标记(如
    )可能无法正常工作,这对我来说并不奇怪。

    不确定如何最好地禁用默认的
    /login/auth
    映射,但要将
    //code>映射到登录页面,您可以将此行添加到
    UrlMappings
    “/”(控制器:“登录”,操作:“身份验证”)
    对于#2,默认的SpringSec
    login/auth.gsp
    视图应用主布局。@Andrew Addin UrlMappings对我没有任何更改。我更改了URL,但它根本不会将我重定向到索引。它仍然呈现为/login/auth/page。一切开始看起来像我必须更改LoginController…最后,我删除了额外的URL映射,并更改了auth.gsp。现在看起来:一切似乎都很好,但我无法访问布局中的${flash.messages},但可能是我做错了什么。Spring Security默认使用
    flash.message
    (no“s”)。布局是在插件实现内部定义到auth.gsp文件中的。我指的是您的
    标记。我怀疑如果你查看源代码,两个标签都会在那里,它会使用第一个标签。