Я пытаюсь реализовать аутентификацию с использованием весенней безопасности.Ошибка аутентификации пользователя Spring Security
Я не могу понять, что я делаю неправильно.
web.xml имеет фильтр безопасности:
<!-- Spring Security -->
<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>
весна-security.xml имеет определенные перехватывает URL-адрес и менеджер аутентификации:
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-4.0.xsd">
<!-- enable use-expressions -->
<http auto-config="true" use-expressions="true">
<intercept-url pattern="/" access="permitAll" />
<intercept-url pattern="/logout**" access="permitAll" />
<!-- Incoming Product -->
<intercept-url pattern="/incomingProduct**" access="hasRole('Administrator') and hasRole('Local_Administrator') and hasRole('Supervisor') and hasRole('Manager')" />
<!-- Maintanence pages -->
<intercept-url pattern="/depotUser**" access="hasRole('Administrator') and hasRole('Local_Administrator')" />
<intercept-url pattern="/product**" access="hasRole('Administrator') and hasRole('Local_Administrator') and hasRole('Supervisor') and hasRole('Manager')" />
<intercept-url pattern="/productOwner**" access="hasRole('Administrator') and hasRole('Local_Administrator') and hasRole('Supervisor') and hasRole('Manager')" />
<intercept-url pattern="/storageTank**" access="hasRole('Administrator') and hasRole('Local_Administrator') and hasRole('Supervisor') and hasRole('Manager')" />
<intercept-url pattern="/admin**" access="hasRole('Administrator')" />
<!-- access denied page -->
<access-denied-handler error-page="/error/403" />
<form-login
login-page="/"
default-target-url="/"
authentication-failure-url="/Access_Denied"
username-parameter="username"
password-parameter="password" />
<logout logout-success-url="/logout" />
<!-- enable csrf protection -->
<csrf />
</http>
<authentication-manager>
<authentication-provider user-service-ref="userSecurityService" />
</authentication-manager>
<beans:bean id="userSecurityService" class="com.tms.securityServices.UserSecurityService" >
<beans:property name="depotUserDao" ref="depotUserDao" />
</beans:bean>
</beans:beans>
UserSecurityService реализует UserDetailsService. В соответствии с конфигурацией в spring-security.xml это должно быть вызвано для аутентификации запроса на вход и вставки пользователя в сеанс. (! Пожалуйста, поправьте меня, если я ошибаюсь)
@Transactional
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException
{
DepotUser user = depotUserDao.findByUserName(username);
System.out.println("User : " + user);
if (user == null)
{
System.out.println("User not found");
throw new UsernameNotFoundException("Username not found");
}
return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), user.isActive(), true, true, true,
getGrantedAuthorities(user));
}
private List<GrantedAuthority> getGrantedAuthorities(DepotUser user)
{
List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
for (DepotUserRole userProfile : user.getUserRole())
{
System.out.println("UserProfile : " + userProfile);
authorities.add(new SimpleGrantedAuthority("ROLE_" + userProfile.getRole()));
}
System.out.print("authorities :" + authorities);
return authorities;
}
Войти контроллер обработки запроса:
@RequestMapping(value = { "/loginRequest" }, method = RequestMethod.POST)
public String loginRequest(@RequestParam String username, @RequestParam String password, HttpServletRequest request, HttpServletResponse response)
{
DepotUser user = depotUserManager.getUserByUsernamePassword(username, password);
if (user != null)
{
request.setAttribute("firstName", user.getFirstName());
request.setAttribute("lastName", user.getLastName());
request.setAttribute("username", user.getUsername());
request.setAttribute("userRoles", user.getUserRole());
return "homePage";
}
Что происходит, когда я войти в систему пользователь получает вход с анонимным пользователем.
Аутентификация не запускается, поскольку я не получаю точки разрыва в UserSecurityService. Также в контроллере весны, который обрабатывает запрос.
Может ли кто-нибудь помочь мне?
Любая помощь приветствуется.
Спасибо,
Благодаря @saljuama я попытался согласно вам предложение, изменение <форма входа-входа-страницу = "/ loginRequest". Все так же подействует. –
Часть в контроллере предназначена только для целей тестирования. –
Да, это тестирование может препятствовать весенней безопасности делать то, что предлагается делать :). Кроме того, что сказал @JacekWcislo в своем ответе, как выглядит ваша форма входа? можете ли вы добавить этот код к своему вопросу? – saljuama