Grails,Spring Security Core - 从应用程序中删除/登录/验证

时间:2014-02-12 18:18:02

标签: grails spring-security

我在Grails应用程序中安装了Spring Security Core,并使用s2-quickstart进行设置。我想'/'来处理登录和注销操作。对我来说,对于我来说,未登录的用户只能访问根页面而不能访问任何其他内容。实际上,除了'/'之外的所有内容都应该是没有角色'ROLE_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_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>

有两个问题:

  1. 配置按我的预期工作,但是当我在浏览器中输入时:localhost:8080/AdminPanel/login/auth页面仍然存在,即使是注销用户我也可以访问它。我想完全删除此URL,无论是登录还是注销,用户都无法访问它。

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

  3. 提前致谢!

1 个答案:

答案 0 :(得分:3)

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

您无法取消映射自动映射控制器,但您可以将其重新映射到发送404的内容,这对用户来说是相同的。一种方法是使用Grails过滤器,例如运行grails create-filters site并将其放入SiteFilters.groovy

package com.foo.bar

class SiteFilters {

   def filters = {
      loginUnmap(uri: '/login/**') {
         before = {
            response.status = 404
            false
         }
      }
   }
}

我不是100%肯定布局问题,但我认为问题是meta标签是由SiteMesh专门处理的。解析页面以确定要使用的布局,然后将部分GSP合并到布局中,因此使用像<g:if>这样的运行时标记不会像您想要的那样工作并不奇怪。