Разбираюсь с Spring Security(и параллельно пишу веб приложение). Всё работает, но есть пара вопросов..
Моя конфигурация:
@Configuration
@ComponentScan("ua")
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
SecurityUserDetailsService securityUserDetailService;
@Autowired
PasswordEncoder passwordEncoder;
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception{
httpSecurity
.authorizeRequests()
.antMatchers("/records").hasRole("USER")
.and()
.formLogin()
.loginPage("/login")
.usernameParameter("username")
.passwordParameter("password")
.and()
.csrf().disable();
}
@Autowired
public void configAuthentication(AuthenticationManagerBuilder auth) throws Exception{
auth.userDetailsService(securityUserDetailService).passwordEncoder(passwordEncoder);
}
}
Контроллер для кастомной логин формы:
@Controller
public class AuthController {
@RequestMapping(value = "/login", method = RequestMethod.GET)
public ModelAndView login() {
ModelAndView model = new ModelAndView();
model.setViewName("login");
return model;
}
}
И форма на вьюшке login.jsp
<form class="form-horizontal" id="formLoginId" action="<c:url value='/login'/>" method="POST">
<c:if test="${param.error != null}">
<div class="form-group">
<div class="alert alert-danger col-md-10 col-md-offset-1">
<strong>Error!</strong> Invalid username or password..
</div>
</div>
</c:if>
<div class="form-group">
<label class="control-label col-md-1" for="login">Login:</label>
<div class="col-md-10">
<input type="text" name="username" class="form-control" id="login" placeholder="Enter login">
</div>
</div>
<div class="form-group">
<label class="control-label col-md-1" for="pwd">Password:</label>
<div class="col-md-10">
<input type="password" name="password" class="form-control" id="pwd" placeholder="Enter password">
</div>
</div>
<button type="submit" class="btn btn-default btn col-md-offset-10">Submit</button>
</form>
Из того, что я понял, это когда мы обращаемся к какому-то защищенному ресурсу (например /records), срабатывает вот это строчка
.loginPage("/login")
и меня перенаправляет в контроллер
login()
с url
/login
который в свою очередь отправляет меня на вьюшку /login.jsp. На этой вьюшке в форме я заполняю инпуты с именами username и password и отправляю их опять на /login методом POST... И вот здесь мне не понятно, какой именно контроллер это отлавливает? Если всё тот же /login, то там метод GET, да и параметры он никакие не принимает (username, password). И откуда на вьюшке берётся переменная ${param.error}? Помогите пожалуйста разобраться с этим, и если что-то в моих рассуждениях не верно, то поправьте. Спасибо.
param.error Ты получишь в случаи неудачной авторизации или же если данные не прошли валидацию.
Форма`же должна выглядить примерно так:
<body>
<form action="/j_spring_security_check" method="POST">
<label for="username">User Name:</label>
<input id="username" name="j_username" type="text"/>
<label for="password">Password:</label>
<input id="password" name="j_password" type="password"/>
<input type="submit" value="Log In"/>
</form>
</body>
Где /j_spring_security_check это дефолтный spring-security URL для обработки данных авторизации.
Но если хочеться как то изменить стандартный механизм авторизации можно переопределить login-processing-url
В примере выше что бы он работа в конфигурации надо добавить login-processing-url каторый и будет указывать на ваш action : "/login"
Можешь загнянуть ко мне на Github и посмотреть как там это реализовано Click
Продвижение своими сайтами как стратегия роста и независимости