2012-01-11 115 views
4

我想在Spring安全网络应用程序中进行简单的用户名/密码验证。我有一个通过传入用户名/密码进行身份验证的Web服务,并取回角色。然后,我需要保留密码以便将来的Web服务调用。春季安全用户名密码验证

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

该文档说明它是"simple" to add in such a mechanism。但示例应用程序是一个命令行hello世界风格的程序,而不是一个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

如何连接这一切?

+0

在[detail here]中包含了SpringSecurity的一些内容(http://techastute.blogspot.com/2013/01/spring-security-in-detail.html),可能对它有用有一个。 – raksja 2013-01-21 17:49:28

回答

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

我会添加用户名/密码后的实际验证;这个只让任何人进来。

+0

您是否确实需要一个单独的'ProviderManager'以及由元素创建的由于某种原因?通常你不会需要两者。 – 2012-01-11 22:05:05

+0

谢谢你,我删除了该块,它仍然在工作,所以我想我不需要它。 – 2012-01-12 01:56:38

1

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

public UserDetails loadUserByUsername(String username) 

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

public Collection<GrantedAuthority> getAuthorities() 
您实现来回报您的角色列表

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> 

为我工作:)