【问题标题】:Grails - spring security with basic auth onlyGrails - 仅具有基本身份验证的弹簧安全性
【发布时间】:2014-05-20 09:26:26
【问题描述】:

我正在尝试创建一个简单的应用程序,实际上是一个概念验证,我的最终用户将仅通过 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(单页应用程序)将可用于每一个都没有任何身份验证...

我在这里错过了什么?

【问题讨论】:

    标签: rest grails spring-security


    【解决方案1】:

    只是为了详细说明伯特的正确答案,你可以在docs for the plugin找到你需要知道的一切。

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

    解决方案是仅在可公开访问的资源('//images/'、'/login/' 等)上指定“permitAll”表达式,然后指定替代表达式在受保护的 URL('/admin/*' 等)上。

    “permitAll”表达式是 Spring 表达式语言 (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
    ]
    

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2015-09-04
        • 2021-06-05
        • 1970-01-01
        • 2012-02-15
        • 2017-04-13
        • 2017-09-22
        • 2014-03-06
        • 1970-01-01
        • 2015-12-06
        相关资源
        最近更新 更多