我正在使用Grails 2.2.2,Spring WebFlow 2.0.0和Spring-Security-Core 2.0-RC2插件。我想确保流程中的最后一步,但一直无法实现。
grails.plugin.springsecurity.interceptUrlMap = [
'/myController/connect?execution=e*s3': ["isFullyAuthenticated()"]
]
当用户尝试进入流程的最后一步时,如果他们未完全通过身份验证,我想将其重定向到登录页面。这适用于我的项目中的其他操作,而不是webflows。
我发现一些文档表明Spring Web Flows和Spring Security可以一起使用:http://docs.spring.io/spring-webflow/docs/2.0.x/reference/html/ch07s04.html。
有什么想法吗?这是Grails的可能吗?
答案 0 :(得分:2)
在安全检查之前,会从网址中删除查询字符串,因此我认为您需要明确地自行检查。
isFullyAuthenticated()
中SecurityExpressionRoot
的实施是
public final boolean isFullyAuthenticated() {
return !trustResolver.isAnonymous(authentication) && !trustResolver.isRememberMe(authentication);
}
所以你可以依赖注入authenticationTrustResolver
bean并进行相同的检查,例如
class MyController {
def authenticationTrustResolver
def springSecurityService
def action() {
if (params.execution == 'e*s3' && !isFullyAuthenticated()) {
response.sendError 401
return
}
...
}
private boolean isFullyAuthenticated() {
def authentication = springSecurityService.authentication
!authenticationTrustResolver.isAnonymous(authentication) && !authenticationTrustResolver.isRememberMe(authentication)
}
}
答案 1 :(得分:2)
或者,您可以这样做:
grails.plugin.springsecurity.interceptUrlMap = [
'/myController/connect': ["(request.getParameter('execute')?:'').matches('^e.*?s3\$') ? fullyAuthenticated : permitAll"]
]
我们的想法是为表达式公开HttpServletRequest,因此我们可以决定是返回fullyAuthenticated还是返回permitAll。
答案 2 :(得分:0)
你不能只导入这个类,并为你的用户添加带有matchin角色的注释到你的step方法吗?
import grails.plugins.springsecurity.Secured
class MyClass() {
@Secured(['ROLE_USER'])
def lastStep() {
// do things
}
}
未经过身份验证的用户将被重定向到登录页面