【问题标题】:Username Password Authentication in Spring SecuritySpring Security 中的用户名密码认证
【发布时间】:2012-02-08 00:20:53
【问题描述】:

我正在尝试在 Spring Security Web 应用程序中进行简单的用户名/密码身份验证。我有一个 Web 服务,它通过传入用户名/密码进行身份验证,然后取回一个角色。然后我需要保留密码以供将来调用 Web 服务。

我的应用最初是使用 App Fuse 创建的,因此它具有一些基于 JDBC 的身份验证。我已经把它撕掉了,但我不确定如何添加我的自定义身份验证。

文档说它是"simple" to add in such a mechanism。但示例应用程序是命令行 hello-world 风格的程序,而不是 Web 应用程序。我似乎在 Web 应用程序中找不到用户名/密码身份验证的示例。

我的 XML 文件中有以下内容:

<beans:bean id="myProvider" class="com.example.MyProvider"></beans:bean>

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

我不知道这是否是放置我的身份验证的正确位置,并且我不确定要实现什么接口。我想我可能需要实现AuthenticationManager。我可能会使用UsernamePasswordAuthenticationToken

如何将所有这些连接在一起?

【问题讨论】:

  • 包含detail here 中的一些 SpringSecurity,可能对某些人有用。

标签: java spring spring-security


【解决方案1】:

我现在已经开始工作了。谢谢大家的帮助。我必须添加一个新的身份验证提供程序,并将其连接到身份验证管理器。这是我最终添加的内容:

<beans:bean id="authenticationManager"
     class="org.springframework.security.authentication.ProviderManager">

  <beans:property name="providers">
    <beans:list>
      <beans:ref local="myAuthenticationProvider"/>
    </beans:list>
  </beans:property>
</beans:bean>

<beans:bean id="myAuthenticationProvider" class="com.example.MyAuthenticationProvider">
</beans:bean>

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

而 MyAuthenticationProvider(取自示例)是:

public class AConnexAuthenticationProvider implements AuthenticationProvider {

    static final List<GrantedAuthority> AUTHORITIES = new ArrayList<GrantedAuthority>();

    static {
      AUTHORITIES.add(new GrantedAuthorityImpl("ROLE_USER"));
    }

    @Override
    public Authentication authenticate(Authentication auth)
            throws AuthenticationException {
        return new UsernamePasswordAuthenticationToken(auth.getName(), auth.getCredentials(), AUTHORITIES);
    }

    @Override
    public boolean supports(Class<? extends Object> paramClass) {
        return true;
    }
}

稍后我将添加对用户名/密码的实际验证;这个只是让任何人进入。

【讨论】:

  • 您是否真的需要一个单独的ProviderManager 以及由于某种原因由&lt;authentication-manager&gt; 元素创建的那个?通常你不需要两者。
  • 谢谢,我删除了那个块,它还在工作,所以我想我不需要它。
【解决方案2】:

这是我的security.xml 所在。看用户配置。我刚刚为处理路径添加了控制器,它工作正常。

<http auto-config="true">
    <intercept-url pattern="/admin/**" access="IS_AUTHENTICATED_REMEMBERED"/>
    <intercept-url pattern="/welcome/**" access="IS_AUTHENTICATED_REMEMBERED" />
    <intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
    <form-login login-page="/login" />
    <logout logout-success-url="/" logout-url="/logout" />
    <!-- Limits the number of concurent sessions a user can have
    <concurrent-session-control max-sessions="1" exception-if-maximum-exceeded="true"/>
-->
</http>


<!--
Usernames/Passwords are
    rod/koala
    dianne/emu
    scott/wombat
-->

<authentication-manager>
    <authentication-provider>
        <password-encoder hash="md5"/>
        <user-service>
            <user name="rod" password="a564de63c2d0da68cf47586ee05984d7" authorities="ROLE_SUPERVISOR, ROLE_USER, ROLE_TELLER" />
            <user name="dianne" password="65d15fe9156f9c4bbffd98085992a44e" authorities="ROLE_USER,ROLE_TELLER" />
            <user name="scott" password="2b58af6dddbd072ed27ffc86725d7d3a" authorities="ROLE_USER" />
        </user-service>
    </authentication-provider>
</authentication-manager>

记住要在你的 web.xml 中添加

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
  <filter-name>springSecurityFilterChain</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
    <listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>
</listener>

为我工作:)

【讨论】:

    【解决方案3】:

    你的提供者应该实现UserDetailsService,并覆盖

    public UserDetails loadUserByUsername(String username)
    

    返回 UserDetails 对象的方法。这是一个您可以在任何“用户”对象上实现的接口。它需要几种方法被覆盖,但从您的角度来看,关键的是

    public Collection<GrantedAuthority> getAuthorities() 
    

    您实施它以返回您的角色列表。

    【讨论】:

      猜你喜欢
      • 2013-11-03
      • 2016-04-30
      • 1970-01-01
      • 2019-03-23
      • 1970-01-01
      • 2015-07-25
      • 1970-01-01
      • 2018-01-15
      • 2014-02-23
      相关资源
      最近更新 更多