Grails:Spring Security 插件对于简单的安全性来说是不是过于强大

Posted

技术标签:

【中文标题】Grails:Spring Security 插件对于简单的安全性来说是不是过于强大【英文标题】:Grails: Is the Spring Security Plugin Too Powerful for Simple SecurityGrails:Spring Security 插件对于简单的安全性来说是否过于强大 【发布时间】:2014-08-19 04:29:57 【问题描述】:

我们有几个使用共享插件的 Grails 应用程序,其中包括为它们提供基本安全性。我们将在未来添加其他类型的身份验证,因此出现了使用 Spring Security 插件的想法。但是,我想知道它是否对于我们相当基本的需求来说太强大了。

目前,我们使用在访问任何 URL 之前运行的 Grails 过滤器并执行安全检查。初始身份验证是通过查找特定的加密 POST 变量或 cookie(从另一个封闭源应用程序发送)并在解密后验证我们数据库中的详细信息来处理的。如果一切顺利,我们认为用户已登录(并且还从加密数据中获得了他们的数字用户 ID)。所有用户都具有相同的访问权限,除了少数具有更大访问权限的用户。这些是在包含其数字 ID 的表中定义的。

但是,我们希望通过使用 Active Directory 凭据、闭源系统的 LDAP 服务器提供的凭据以及在不远的将来通过 CAS 服务器添加直接登录这些 Grails 应用程序的功能。

我最初的方法是寻找允许共享插件与这些不同系统交互并针对它们进行简单身份验证的库。但是,我注意到 Spring Security 似乎为所有这些不同类型的身份验证提供了插件,这将加快开发速度。但是,该模块本身似乎相当复杂,并且面向更高级的设置,这意味着我们可能会花费大量时间来设置 Spring Security,以节省使用其 LDAP、CAS 等插件的时间。

任何想法/cmets/等。非常感谢。

另外,如果我们要使用 Spring Security 插件,有人可以发表评论并让我知道是否可以进行以下设置...

我们希望避免为各种应用程序创建数据库表以进行身份​​验证。我们基本上想告诉 Spring Security,如果用户通过了身份验证,他们就会被身份验证。没有角色,没有组,没有什么花哨的(除了少数应用程序会有一个额外的角色/组,为用户提供额外的权限......对于这些应用程序,显然需要一个数据库表)。

我们还希望默认始终要求所有内容的安全性,并添加额外代码仅用于禁止此操作以允许未经身份验证的访问。这背后的想法是,如果开发人员忘记将 Spring Security 标记代码添加到控制器或操作中,它已经默认始终需要身份验证。

此外,我们仍然需要通过从另一个应用程序发送的加密 POST 变量或加密 cookie 来保留原始身份验证方法。是否可以将其构建到 Spring Security 中?

最后,Spring Security 插件能否存储身份验证后检索到的数字用户 ID 以识别用户,而不是存储身份验证期间使用的实际用户名?

【问题讨论】:

【参考方案1】:

嗯,您的帖子中有很多问题。我会尽力回答我记得的。

首先,Spring Security 很复杂。那是因为真正的安全是很难的。然而,Spring Security 和某种程度上的 Grails 插件都是非常可配置和可定制的。一旦您完成了高学习曲线,这将对您有利。

现在投资 Spring Security,您可能会省去很多麻烦,并最终节省时间和精力,因为您的需求正在增长并变得越来越复杂。

我建议您阅读Spring Security documentation、Spring Security Grails documentation 以及尽可能多的带有 spring-security 标记的 SO 帖子。投资几本关于 Spring Security 的好书也不错。

这些是我的高级想法/cmets。

就 Spring 安全性的可能性而言(您的其他问题)。

    是的,您可以将 Spring Security 设置为不使用任何类型的数据库表。 您可以编写自己的安全身份验证过滤器,通过参数/等进行自定义身份验证。 默认情况下,所有内容都锁定在最新的 Grails Spring Security 插件中,如果您使用 interceptUrlMap,您只需更改哪些 URL 没有安全性或与默认值 IS_AUTHENTICATED_FULLY 不同的安全性。 使用自定义 UserDetailsServiceUserDetails,您可以在 principal 中使用数字 ID 或任何其他您想要的详细信息。

总而言之,通过正确的努力和对 Spring Security 的理解,您可以使其满足您的需求。但是,这不是一个简短而快速的过程,需要大量阅读。

【讨论】:

【参考方案2】:

Well Springs Security 是当今最好的安全插件之一。这是高度可定制和可配置的。

默认情况下,每个 url 都被锁定在 spring security 中。但是您可以通过在 config.groovy 中添加配置来设置所有 url 的解锁

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

以上内容将使您无需登录即可访问所有网址。不,您可以在控制器级别对所有网址的显式设置进行限制。

    您不需要在数据库中有任何 Roles 表,如果您只有 Admin 和 User 角色,则可以使用 Enum insted。 您甚至可以将 sprigsecurity 配置为使用数据库的任何列来验证用户身份,无论是数字还是字符串类型。您需要做的就是覆盖 UserDetailsS​​ervice 和 UserDetails 服务类。这样,您的所有自定义设置都会覆盖原始配置。

此外,我们仍然需要保留原始的身份验证方法 通过从另一个应用程序发送的加密 POST 变量或 加密的 cookie。是否可以将其构建到 Spring Security 中?

为此,他们在 springsecurity 中也得到了很好的支持。您可以在外部来源完成身份验证并使用 srinfsecurity 对其进行配置。

【讨论】:

以上是关于Grails:Spring Security 插件对于简单的安全性来说是不是过于强大的主要内容,如果未能解决你的问题,请参考以下文章

Grails,Spring Security LDAP 插件

在 grails 中使用 spring-security 插件时出错

使用 Spring Security Grails 插件编码密码

Grails - 卸载 Spring Security Core

通过 Spring Security 配置 Grails 配置插件 grails-ckeditor

带有 grails 的 Spring Security 核心插件