在 Grails Spring Security 插件中将 AccessDecisionManager 更改为 UnanimousBased

Posted

技术标签:

【中文标题】在 Grails Spring Security 插件中将 AccessDecisionManager 更改为 UnanimousBased【英文标题】:Change AccessDecisionManager to UnanimousBased in Grails Spring Security Plugin 【发布时间】:2013-09-06 22:17:14 【问题描述】:

我们正在使用 Grails spring 安全插件:

http://grails.org/plugin/spring-security-core

我只是想将默认访问决策管理器从默认的 AffirmativeBased 更改为 UnanimousBased。我在插件手册的任何地方都没有看到它:

http://grails-plugins.github.io/grails-spring-security-core/docs/manual/

有谁知道这是否可以改变?

我添加了一个额外的选民“myVoter”,它被检测到并且工作正常。

grails.plugins.springsecurity.voterNames = [
    'myVoter', 'authenticatedVoter', 'roleVoter',
]

【问题讨论】:

你得到答案了吗?我有同样的问题。 我不这么认为。事实证明,Spring 安全性不适合我们的访问控制模型。我们最终推出了自己的产品。 【参考方案1】:

基于 Burt Beckwith 的“Hacking the Grails Spring Security Plugin”[http://www.slideshare.net/gr8conf/hacking-the-grails-spring-security-plugins],应该可以简单地提供 accessDecisionManager bean 的不同实现。像这样的:

accessDecisionManager(org.springframework.security.access.vote.UnanimousBased)

在 resources.groovy 中

当我尝试这个时,我遇到了 bean 定义中的构造函数语法问题。访问决策管理器需要构造函数中的投票者列表,我无法引用如何将 config.groovy 中定义的投票者作为构造函数的参数。当我偶然发现 Grails Spring Security Plugin 中 AuthenticatedVetoableDecisionManager 的源代码时,我正要从 UnanimousBased 派生出我自己的决策管理器(带有无参数构造函数)。这个类将选民分成两半......如果任何被拒绝(例如 AUTHENTICATED_FULLY 系列),任何从 AuthenticatedVoter 派生的东西都会立即失败,但如果任何其他选民被授予(例如 RoleVoter),则所有其他选民都将通过。我想为我的自定义选民提供 AuthenticatedVoter 功能,所以我只是从 AuthenticatedVoter 派生(确保覆盖所有接口方法,以免意外获得任何基类功能)并坚持使用默认决策管理器。

【讨论】:

以上是关于在 Grails Spring Security 插件中将 AccessDecisionManager 更改为 UnanimousBased的主要内容,如果未能解决你的问题,请参考以下文章

Grails - 卸载 Spring Security Core

Grails - grails-spring-security-rest - 无法从 application.yml 加载 jwt 机密

在 Grails 中使用 Pre/Post Spring-Security Annotations

Grails 3.3.9 spring security 3.2.3 spring security ui 3.1.2 无法更改用户数据

Grails 3 Spring Security 覆盖登录表单

Grails 3.0 和 Spring Security