Spring Security 2.0.6, что вызывает метод loadUserByName UserDetailService - PullRequest
0 голосов
/ 17 марта 2011

Я создаю простое приложение Sring MVC. И теперь я пытаюсь добавить безопасность Spring. Я добавил customUserDetailsService, который использует DAO для доступа к базе данных MySql и получения пользователей.

@Transactional(readOnly = true)
public class CustomUserDetailService implements UserDetailsService {

    @EJB(name = "UserDAOLocal")
    UserDAOLocal dao = null;

    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException {
        System.out.println("Checking if this is invoked")
        UserDetails user = null;
        DBUsers dbUser = dao.findUserName(username);

        user = new User(dbUser.getUserName(), dbUser.getPassword(), true, true, true, true, getAuthorities(dbUser.getAccess()));
        return user;
    }

    private GrantedAuthority[] getAuthorities(Integer access) {

        GrantedAuthority[] authList = new GrantedAuthority[2];

        authList[0] = new GrantedAuthorityImpl("ROLE_USER");
        if (access.compareTo(1) == 0) {
            authList[1] = new GrantedAuthorityImpl(("ROLE_ADMIN"));

        }
        return authList;
    }
}

И я добавил UserDetailsService к Spring-security.xml.

  <security:authentication-manager alias="authenticationManager">
    <security:authentication-provider user-service-ref="customUserDetailsService"/>
</security:authentication-manager>

<bean id="customUserDetailsService" class="service.CustomUserDetailService"/>

Я поставил j_spring_security_check как действие для формы входа на странице login.jsp.

Когда я ввожу правильное имя пользователя и пароль, приложение всегда говорит, что это неправильно. Более того, я не могу найти никаких доказательств того, что customUserDetailsService работает в любое время. (Я использовал System.out.println("Checking if this is invoked") для проверки на сервере).

Что вызывает loadUserByUsername() метод CustomUserDetailsService? Когда он вызывается?

Как мне это настроить?

(Все предоставленные мною коды могут быть ненужными:))

EDIT: Вот остальная часть Spring-Security.xml

<security:http auto-config="true">


    <security:intercept-url pattern="/AddEmployee.htm" access="ROLE_ADMIN"/>
    <security:intercept-url pattern="/FireEmployee.htm" access="ROLE_ADMIN"/>
    <security:intercept-url pattern="/employees.htm" access="ROLE_USER"/>

    <security:form-login login-page="/login.htm"
authentication-failure-url="/login.htm?error=true"
login-processing-url="/j_spring_security_check.htm"
default-target-url="/common.htm"/>

    <security:logout
invalidate-session="true"
logout-success-url="/login.htm"
logout-url="/logout.htm"/>

</security:http>

Я обошел проблему, отредактировав провайдера аутентификации следующим образом. Я решил использовать не DAO, а пользовательскую базу данных. и использовали жестко запрограммированных пользователей внутри XML-файла

 <security:authentication-provider>
    <security:user-service>
        <security:user name="sam" password="sam123" authorities="ROLE_ADMIN,ROLE_USER" />
        <security:user name="pam" password="pam123" authorities="ROLE_USER" />
    </security:user-service>
</security:authentication-provider>

Это отлично работает.

Но я хотел бы знать, почему мой customUserDetailService никогда не использовался, и узнать, как правильно его использовать.

1 Ответ

2 голосов
/ 17 марта 2011

Обмен больше настроек.из Spring-security.xml поможет (если это возможно)

Безопасность Spring разработана таким образом, чтобы ваш провайдер аутентификации вызывал loadUserByUsername() метод UserDetailsService, который возвращает объект userDetails.Процесс выглядит следующим образом:

  • Задачей Authentication Manager является Аутентификация пользователя.Поэтому он отправляет имя пользователя на Authentication provider.

  • Authentication Provider, вызывает loadUserByUsername() метод и передает имя пользователя типа String, которое возвращает userDetails Object.

  • Теперь этот userDetails объект содержит всю необходимую информацию для аутентификации, такую ​​как имя пользователя, пароль, isEnabled и т. Д.

Теперь, если вы хотите настроить userDetailsServiceдля использования Dao вы можете настроить его.

Так работает процесс аутентификации.Вы можете сослаться на эту ссылку для более широкого понимания.

...