Я создаю простое приложение 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 никогда не использовался, и узнать, как правильно его использовать.