我在工作中使用的应用程序使用Grails 3.我正在尝试执行预身份验证,如此article中所述,但我很难解决如何禁用提供的常规身份验证由grails 3 spring security plugin。
以下是我目前的情况:用户A点击了我的网页。我想解析请求的标头并取出角色和用户名信息。如果用户名或角色为空,我会将用户重定向到某个网关。简单来说,我想通过调用插件提供的静态规则来仅使用spring security进行授权。即
grails.plugin.springsecurity.controllerAnnotations.staticRules = [
[pattern: '/serviceb/**', access: "hasAnyRole('ROLE_COOL','ROLE_UNCOOL')"],
[pattern: '/cools/**', access: ['ROLE_ADMINS']],
[pattern: '/*', access: 'isAuthenticated()']
]
这就是我不需要Spring安全性来执行任何登录功能的原因,因为first article状态,我们只能将其用于身份验证。
我尝试了什么:
首先,我删除了我的application.groovy文件中的所有与身份验证相关的调用(默认情况下在运行插件的快速入门时创建),即连接字符串,搜索过滤器,但不静态规则< / p>
接下来,我尝试使用这两个帖子提供的解决方案:on stack和此on blog。
我创建了一个Filter来扩展AbstractPreAuthenticatedProcessingFilter
package Cool.service.authentication
import org.springframework.security.web.authentication.preauth.AbstractPreAuthenticatedProcessingFilter
import javax.servlet.http.HttpServletRequest
class CGAuthenticationFilter extends AbstractPreAuthenticatedProcessingFilter {
@Override
protected Object getPreAuthenticatedPrincipal(HttpServletRequest request) { "username" }
@Override
protected Object getPreAuthenticatedCredentials(HttpServletRequest request) { "N/A" }
}
我的启动配置现在看起来像这样:
import grails.plugin.springsecurity.SecurityFilterPosition
import grails.plugin.springsecurity.SpringSecurityUtils
class BootStrap {
def init = { servletContext ->
SpringSecurityUtils.clientRegisterFilter('CGAuthenticationFilter', SecurityFilterPosition.PRE_AUTH_FILTER.order)
}
}
我的Spring资源看起来像这样:
import Cool.service.authentication.CGAuthenticationFilter
beans = {
myAuthenticationFilter(CGAuthenticationFilter) {
authenticationManager = ref('authenticationManager')
checkForPrincipalChanges = true
}
}
最后,将这一行添加到我的spring.groovy spring security插件配置中:
grails.plugin.springsecurity.providerNames = ['preAuthenticatedAuthenticationProvider', 'anonymousAuthenticationProvider']
但是,我在尝试运行应用程序时遇到超级geneirc错误,其中服务器“失败”启动并且java返回非零值。这让我相信我走向了错误的方向,实施是完全错误的
答案 0 :(得分:2)
要解决这个问题,我不得不更改几个文件。首先,我的Bootstrap文件现在包含以下init块:
SpringSecurityUtils.clientRegisterFilter('requestHeaderAuthenticationFilter', SecurityFilterPosition.PRE_AUTH_FILTER)
我的bean(resources.groovy)文件现在包含:
userDetailsService(grails.plugin.springsecurity.userdetails.GormUserDetailsService) {
grailsApplication = ref('grailsApplication')
}
userDetailsByNameServiceWrapper(org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper) {
userDetailsService = ref('userDetailsService')
}
preAuthenticatedAuthenticationProvider(org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider) {
preAuthenticatedUserDetailsService = userDetailsByNameServiceWrapper
}
requestHeaderAuthenticationFilter(Cool.service.authentication.GCHeaderAuthenticationFilter) {
authenticationManager = ref('authenticationManager')
}
除此之外,配置的其余部分是正确的。