2012-01-11 2 views
4

Я пытаюсь сделать простую аутентификацию имени пользователя и пароля в веб-приложении Spring Security. У меня есть веб-служба, которая аутентифицируется, передавая имя пользователя/пароль и возвращает роль. Затем мне нужно сохранить пароль для будущих вызовов веб-сервисов.Username Password Authentication in Spring Security

Мое приложение было первоначально создано с помощью приложения Fuse, поэтому у него была аутентификация на основе JDBC. Я разорвал это, но я не уверен, как добавить свою собственную аутентификацию.

В документации говорится, что это "simple" to add in such a mechanism. Но примерное приложение - это программа hello-world для командной строки, а не веб-приложение. Я не могу найти пример аутентификации имени пользователя и пароля в веб-приложении.

У меня есть следующие в моем файле XML:

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

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

Я не знаю, если это правильное место, чтобы поставить свою аутентификацию, и я не уверен, что интерфейс для реализации. Я думаю, мне, возможно, потребуется реализовать AuthenticationManager. И я мог бы использовать UsernamePasswordAuthenticationToken.

Как подключить все это вместе?

+0

Состоит из SpringSecurity в [подробно здесь] (http://techastute.blogspot.com/2013/01/spring-security-in-detail.html), может быть полезно для кто то. – raksja

ответ

4

Я получил это работает. Спасибо всем за помощь. Мне пришлось добавить нового поставщика аутентификации и подключить его к Authentication Manager. Вот что я в конечном итоге добавив:

<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', а также созданный элементом' '? Обычно вам не нужны оба. –

+0

Спасибо, я удалил этот блок, и он все еще работает, поэтому, я думаю, мне это не нужно. –

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> 

работает для меня :)