Grails - 仅具有基本身份验证的弹簧安全性

时间:2014-04-07 22:25:36

标签: rest grails spring-security

我正在尝试创建一个简单的应用程序,实际上是一个概念证明,我的最终用户只能通过RESTful服务与服务器进行交互。我的用户界面将使用angularjs向这些服务发送ajax请求,然后在浏览器中呈现响应。

为了创建安全层,我正在尝试配置spring安全性插件,但我的配置存在问题。在这一刻,这是我的配置:

grails.plugin.springsecurity.userLookup.userDomainClassName = 'mymoney.Subject'
grails.plugin.springsecurity.userLookup.authorityJoinClassName = 'mymoney.SubjectRole'
grails.plugin.springsecurity.authority.className = 'mymoney.Role'

grails.plugin.springsecurity.useBasicAuth = true
grails.plugin.springsecurity.basic.realmName = "Restricted Access"

grails.plugin.springsecurity.controllerAnnotations.staticRules = [
    '/**': ['permitAll']
]

grails.plugins.springsecurity.filterChain.chainMap = [
    '/rest/**': 'JOINED_FILTERS,-exceptionTranslationFilter',
    '/**': 'JOINED_FILTERS,-basicAuthenticationFilter,-basicExceptionTranslationFilter'
]

如果我保留我的配置,那么每个人都可以使用一切,甚至是/ rest / **资源。我的猜测是,在chainMap之前的staticRules会搞乱一切。但问题是,如果我删除它,那么一切都属于我的基本认证......

所以我真正想要的是/ rest / **下的每个资源都将通过基本身份验证来保护,并且可以在根上下文('/')中访问的SPA(单页面应用程序)可用于每个人都没有任何认证...

我在这里缺少什么?

2 个答案:

答案 0 :(得分:2)

如果你有/ ** = permitAll,那么url如何在过滤器链中分区并不重要 - 你没有阻止任何东西。您还需要拆分访问规则,例如

grails.plugin.springsecurity.controllerAnnotations.staticRules = [
   '/rest/**': ['ROLE_ADMIN'],
   '/**': ['permitAll']
]

答案 1 :(得分:1)

只是详细说明Burt的正确答案,您可以在docs for the plugin找到您需要了解的所有内容。

为了让您入门,“permitAll”表达式实际上使相应的URL可公开访问。在这种情况下,“/ **”URL是相应的URL,它对应于域下的每个可能的URL。因此,您的staticRules配置可以使您的整个应用程序公开访问。

解决方案是仅在可公开访问的资源('/ / images / ','/ login / '等)上指定“permitAll”表达式,然后指定备用表达式在安全的URL上('/ admin / *'等)。

“permitAll”表达式是Spring Expression Language(SpEL)的成员。在我链接的文档底部有一个包含许多SpEL表达式的表。使用SpEL,您可以为应用程序配置各种访问规则。例如:

grails.plugin.springsecurity.controllerAnnotations.staticRules = [
   '/**/images/**': ['permitAll'],        // publicly accessible images directory
   '/register': ['isAnonymous()'],        // has to be anonymous to register
   '/profile/**': ['isAuthenticated()'],  // has to be authenticated
   '/lounge/**': ['ROLE_USER', 'ROLE_ADMIN'],  // has user or admin role
   '/admin/**': ['ROLE_ADMIN']            // has to be an administrator
]

更多选项是可能的,文档是一个很好的信息资源。

相关问题