gpt4 book ai didi

Grails、Spring Security Core - 从应用程序中删除/登录/授权

转载 作者:行者123 更新时间:2023-12-01 15:37:48 37 4
gpt4 key购买 nike

我在我的 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']
]

我在我的每个 Controller 上设置了 @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 View 也会使用 "main" 布局呈现,尽管我有我的代码上面在我的 index.gsp 中提到,它应该将布局更改为 "login"。为什么?

提前致谢!

最佳答案

/login/auth因为 "/$controller/$action?/$id?" 工作UrlMappings 中的映射。因此,所有 Controller 都是自动映射的。一种选择是删除它,但这意味着您必须随后显式映射所有 Controller 。这样做有好处,grails.org 应用程序使用了这种方法。

您无法取消映射自动映射的 Controller ,但您可以将其重新映射到发送 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% 确定布局问题,但我认为问题在于元标记由 SiteMesh 专门处理。该页面被解析以确定要使用的布局,然后您的 GSP 的部分内容被合并到布局中,因此使用像 <g:if> 这样的运行时标签对我来说并不奇怪。不要像你想要的那样工作。

关于Grails、Spring Security Core - 从应用程序中删除/登录/授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21736282/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com