当前位置: 首页 > 知识库问答 >
问题:

Spring security 3在使用OpenID进行身份验证时忽略禁用/锁定标志

蒋骏
2023-03-14

指示用户是启用还是禁用。无法对禁用的用户进行身份验证。

此标志的值在构造函数中给定。

当使用表单进行身份验证时,它似乎可以很好地工作。不幸的是,Spring的OpenID似乎完全忽略了标志。我尽我所能地记录了,我可以在日志中看到:

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans
  xmlns="http://www.springframework.org/schema/security"
  xmlns:beans="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  http://www.springframework.org/schema/security
  http://www.springframework.org/schema/security/spring-security-3.0.xsd">

  <global-method-security secured-annotations="enabled">
  </global-method-security>

  <http use-expressions="true" auto-config="true">
    <intercept-url pattern="/" access="permitAll" />
    <!-- ... other pattens -->
    <form-login
        login-page="/"
        authentication-success-handler-ref="loginSuccessHandler"
    />

    <remember-me data-source-ref="dataSource" user-service-ref="myUserDetails"/>

    <openid-login
        user-service-ref="openIdAuth"
        authentication-success-handler-ref="loginSuccessHandler"
        authentication-failure-handler-ref="openIdFailureHandler"
        >
      <attribute-exchange>
        <openid-attribute name="email" type="http://axschema.org/contact/email" required="true" />
        <openid-attribute name="name" type="http://axschema.org/namePerson" />
      </attribute-exchange>
    </openid-login>
    <logout success-handler-ref="logoutSuccessHandler"/>
  </http>

  <authentication-manager>
    <authentication-provider ref="daoAuthenticationProvider"/>
  </authentication-manager>

  <beans:bean id="daoAuthenticationProvider"
    class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
    <beans:property name="userDetailsService" ref="myUserDetails"/>
    <beans:property name="saltSource" ref="saltSource"/>
    <beans:property name="passwordEncoder" ref="passwordEncoder"/>
    <beans:property name="preAuthenticationChecks">
      <beans:bean class="org.springframework.security.authentication.AccountStatusUserDetailsChecker"/>
    </beans:property>
  </beans:bean>
</beans:beans>

这里的MyUserDetails是我的自定义bean,它从数据库加载用户并返回user的简单自定义实现:

public class UserInfo
    extends User
{
    public UserInfo(UserEntity user)
    {
        super(  user.getUserName(),
                user.getPassword(),
                !user.isDisabled(), // enabled
                true, // non-expired
                true, // credentials non-expired
                !user.isLocked(), // non-locked
                UserInfo.authorities(user) // my static method
            );
        // store some info for further reference here
        // ...
    }
    // ...
}

共有1个答案

荀正谊
2023-03-14

我现在正在处理类似的情况。

Spring Security基于过滤器链。如果您声明openid,那么opendId身份验证将添加到您的安全过滤器链中(我不知道spring openid的详细信息)。

当您的筛选器链处于openId步骤并且有人已经登录时,它将返回auth success,而不监视UserDetails表中的disable状态。

 类似资料:
  • 我有一个API服务器(资源服务器)和多个应用程序、Web GUI(SPA)和一个桌面客户端,也许还会有更多。除了超文本传输协议之外,我还想为我的API服务器使用openid-connect基本身份验证。应该可以配置使用哪个openid提供商。我自己的,facebook,google...我只想做身份验证,我不需要他们的API。我只需要一些个人资料数据,如电子邮件或名字。 比方说,我已经将googl

  • 我正在尝试使用urllib3连接到网页。代码如下所示。 如果我们假设url是需要使用用户名和密码进行身份验证的某个网页,那么我是否使用正确的代码进行身份验证? 我使用urllib2做这件事很舒服,但使用urllib3做不到同样的事情。 非常感谢

  • jwt不应该仅仅用于认证用户吗?我读到过可以在里面存储非敏感的东西,比如用户ID。将权限级别之类的东西存储在令牌中可以吗?这样我可以避免数据库调用。

  • 问题内容: 我可以通过接收到请求的xml 但不是 没有JavaScript错误,没有跨域策略问题。可能是语法错误,但是我找不到合适的教程。有什么建议吗? 问题答案: 我认为您需要纯格式:

  • 问题内容: 在我的iOS应用程序中,我想使用WKWebView在应用程序中包装外部URL 。此URL需要基本身份验证(它需要用户和密码凭据,如以下屏幕截图所示)。 经过一番调查,我尝试使用 didReceiveAuthenticationChallengemethod来启用自动 登录,因此我不了解它的工作原理。 这是我的代码。 I’m facing with this exception: If

  • 我正在尝试使用Sprint安全框架在Spring Boot中为我的HTTP请求设置授权。我是Spring Security的新手,我找不到任何关于我的情况的文档。 我知道我们必须重写WebSecurity配置适配器方法-configure(AuthenticationManagerBuilder) 这是我试图建立的流程。我的前端和后端托管在不同的域中,所以我也在寻找跨来源的授权。通过发布到REST