Spring Security中的用户名密码验证

时间:2012-01-11 16:19:54

标签: java spring spring-security

我正在尝试在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

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

3 个答案:

答案 0 :(得分:4)

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

<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;
    }
}

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

答案 1 :(得分: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>

适合我:)

答案 2 :(得分:1)

您的提供商应实施UserDetailsService,并覆盖

public UserDetails loadUserByUsername(String username)

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

public Collection<GrantedAuthority> getAuthorities() 
您实现的

返回角色列表。