2014-02-12 74 views
3

我在我的Grails应用程序中安装了Spring Security Core,并使用s2-quickstart进行设置。我想'/'来处理登录和注销操作。这对我来说意味着没有登录的用户只能访问根页面而没有其他任何东西。实际上,除'/'之外的所有内容应该是没有角色'ROLE_ADMIN'的用户的blocket。Grails,Spring Security Core - 从应用程序中删除/登录/认证

我加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. 配置WOR ks像我所料,但是当我输入浏览器:localhost:8080/AdminPanel/login/auth页面仍然存在,我可以访问它甚至是注销用户。我想彻底删除这个URL,无论是登录还是注销用户都不应该能够访问它。

  2. 即使用户是尽管我有我在上面index.gsp中的mentiond代码,它应该改变布局"login"注销,/login/auth视图是使用"main"布局呈现。为什么?

在此先感谢!

+0

不确定如何最好地禁用默认的'/ login/auth'映射,而是将'/'映射到登录页面,你可以将这一行添加到'UrlMappings':'“/”(controller:“login “,action:”auth“)'对于#2,默认的SpringSec'login/auth.gsp'视图应用主布局。 –

+0

@Andrew Addin UrlMappings对我没有任何帮助。我更改了网址,但它并没有将我重定向到索引。它仍然呈现/ login/auth/page。一切开始看起来像我必须改变LoginController ... – kmb

+0

最后,我删除了额外的URL映射,我改变了auth.gsp。现在,它看起来像: 一切似乎运作良好,但我不能访问$ {闪存。消息}在我的布局,但也许我只是做错了什么。 – kmb

回答

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>这样的运行时标签不像您想要的那样工作并不奇怪。

+0

布局在插件实现内部定义为auth.gsp文件 – kmb

+0

我指的是你的''标签。我怀疑如果你查看源代码,这两个标签都会在那里,它会使用第一个标签。 –

相关问题