没有身份验证的 Grails Spring Security 插件访问控制/授权?
Posted
技术标签:
【中文标题】没有身份验证的 Grails Spring Security 插件访问控制/授权?【英文标题】:Grails Spring Security plugin Access Control/Authorization without Authentication? 【发布时间】:2012-09-04 17:43:51 【问题描述】:我的问题:
我希望在我的 Grails 应用程序中使用 Spring Security 插件的访问控制/授权机制,而不必使用插件的身份验证机制。我发现的各种 Grails Spring Security 插件示例 (like this one) 结合了这两个功能。有没有简单的方法来进行访问控制?
背景:
我想为我现有的应用程序添加基于角色的访问控制。我很想对我的控制器进行注释,或者使用 Config.groovy 映射方法来设置访问控制。 我的应用已经有一个用户域类。 用户域类已经使用 BCrypt 处理加密密码。 该应用没有“角色”域类。 我已经有了用于处理登录和注销的控制器操作、视图和业务逻辑。我没有兴趣用插件的实现替换它。在正确的轨道上,但不是很有帮助:
我知道这是可能的,正如其他 question 中所解释的那样:但是,问题及其答案解释了如何使用原始 Spring Security 框架在 Java 应用程序中执行此操作。我希望有人以与 Grails Spring Security 插件的最新版本(撰写本文时为 1.2.7.3)兼容的方式来说明如何执行此操作。我不想重新发明已经被插件照顾的***。
此外,example 解释了如何执行其中一些操作,但它似乎已经过时,因为它基于使用 Spring Security 2.x 的旧版本插件。它也只对应用程序的一部分使用自定义身份验证,而它看起来仍然在其他地方使用 Spring Security 插件的域类。
怎么做?
有人可以为我设计一个方法吗? 我假设我需要创建我的角色域类。 之后,我假设它将涉及自定义身份验证对象等。但是如何让他们使用插件的现有代码呢?
【问题讨论】:
【参考方案1】:您可以使用自定义身份验证提供程序,我有一个更新版本,这是我最近一次谈话的一部分。请参阅此博客文章,其中包含示例应用程序和演讲视频链接:http://burtbeckwith.com/blog/?p=1090
使用自定义 UserDetailsService
会很简单 - 这是插件最常见的自定义,因此在文档中有自己的章节:http://grails-plugins.github.com/grails-spring-security-core/docs/manual/guide/11%20Custom%20UserDetailsService.html
基本上,您需要创建一个 Spring Security User
实例,而 Spring Security(和插件)并不关心您如何获取数据。因此,您的自定义 UserDetailsService
只需要成为您当前的身份验证方案和 Spring Security 之间的桥梁。
【讨论】:
嗨@Burt Beckwith,感谢您的回复。我观看了视频的前 15 分钟,但看起来它主要是对 Grails 过滤器和 Spring Security 内部的深入了解。无意冒犯,但我真的不想更多地了解这些东西。我很高兴使用它。我应该多看吗?关于示例应用程序,看起来它的重点是修改 Spring Security 插件的身份验证方法,而不是批量替换它。我很难看出我会做什么与这个例子相同或不同。在下一条评论中查看更多信息... 我在发帖前也阅读了有关 UserDetailsService 的信息,但我对何时或为什么要这样做感到困惑。该文档说明了如何执行此操作,但没有说明这将是有用的用例、情况等。这如何适用于我的情况?谢谢! 当您需要一种不同于插件提供的加载用户和角色数据的方法时,自定义 UserDetailsService 非常有用,就这么简单。这就是为什么覆盖如此普遍的原因。 Burt,我还有几个点需要连接。我创建了我的自定义 UserDetails 类和 UserDetailsService。我将 userDetailsService bean 声明添加到 resources.groovy。我将我的 interceptUrlMap 添加到 Config.groovy。我创建了一个受保护的 URL (IS_AUTHENTICATED_FULLY) 并且应用程序的其余部分是打开的。现在,当我尝试访问受保护的 URL 时,我被重定向到“/login/auth”。我是否登录都没关系。我似乎遗漏了一些假设。显然,自定义 User 和 UserDetailsService 不足以满足我的要求。还有其他提示吗?【参考方案2】:我最终创建了自己的访问控制/授权机制,而不是使用 Spring Security 插件。我永远无法弄清楚如何将插件的身份验证机制与授权机制分开。自己做这项工作很容易。
我做了以下事情:
创建了一个新的角色域类。 向我的 User 域类添加了 Set 属性和 hasMany 关系。 创建了一个新的 AuthorizationFilters 过滤器。这是我输入授权规则的地方。在这个过滤器中,我可以检查用户是否具有访问给定 URL 并重定向到登录页面、重定向到“未授权页面”或允许他们通过所需的角色。这没有插件很好的语法糖,也不是很简洁,但它很容易实现和理解。
【讨论】:
以上是关于没有身份验证的 Grails Spring Security 插件访问控制/授权?的主要内容,如果未能解决你的问题,请参考以下文章
Grails Spring Security 验证多个 url 的访问
如何处理 grails spring-security-rest 插件中的自定义身份验证异常?
Grails - Spring 安全 ldap 活动目录身份验证 - 凭据错误错误