了解Spring Security中的allowAll()和Anonymous()的区别

Wol*_*one 6 java security spring

我只想确保我正确地得到了这个信息,所以我会很感激您的答复。在我的configure-override中:

@Override
protected void configure(HttpSecurity http) throws Exception
{
    http.
        [...]
        permitAll()
        [...]
}
Run Code Online (Sandbox Code Playgroud)

所述permitAll()允许任何请求,而:

anonymous()
Run Code Online (Sandbox Code Playgroud)

将只授予那些用户访问登录,但 在这两种情况下的HttpSession -object默认情况下创建。

那正确吗?

Loo*_*sky 7

从Spring 文档中

通常,采用“默认拒绝”的做法被认为是一种良好的安全做法,在该方法中,您明确指定允许的内容,并禁止其他所有内容。定义未经身份验证的用户可以访问的内容的情况与此类似,尤其是对于Web应用程序。许多站点要求用户必须通过身份验证才能使用少数几个URL(例如,主页和登录页面)。在这种情况下,最简单的是为这些特定的URL定义访问配置属性,而不是为每个受保护的资源定义访问配置属性。换句话说,有时很高兴地说默认情况下需要ROLE_SOMETHING并且仅允许该规则的某些例外,例如应用程序的登录,注销和主页。您还可以从过滤器链中完全忽略这些页面,从而绕过访问控制检查,

这就是我们所说的匿名身份验证。

请注意,“匿名身份验证”的用户和未经身份验证的用户之间没有真正的概念差异。Spring Security的匿名身份验证只是为您提供了一种更方便的方式来配置访问控制属性。

使用.permitAll()将配置授权,以便在该特定路径上允许所有请求(来自匿名用户和已登录用户)。

.anonymous()表达式主要是指用户的状态(是否登录)。基本上,直到用户被“认证”为止,它就是“匿名用户”。就像每个人都有“默认角色”一样。

  • @MingtaoSun也许你有一些特殊的页面,只有在你没有登录的情况下才可以访问,比如注册公式或登录公式或某种调查问卷 (3认同)
  • 很抱歉回复迟到。这使事情变得更清楚了,但有一点我还是有些困惑。因此,“ anonymous()”阻止登录用户访问是预期的行为,对吗?我可能缺乏该领域的经验,但是如果这是真的,那在哪里有用?我可以想象在某些情况下我想将已登录用户重定向(例如,“登录页面”到“您已经登录-页面”),但是我遇到的默认值403似乎没有用。 (2认同)
  • 看来 <intercept-url pattern="/**" access="permitAll()" /> 允许登录用户和匿名用户访问,而 <intercept-url pattern="/**" access="isAnonymous( )" /> 只允许匿名用户访问,不允许登录用户访问。我还想知道 isAnonymous() 的用法是什么 (2认同)