29
Янв
2017

Аутентификация в Spring Security

Разбираюсь с 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}? Помогите пожалуйста разобраться с этим, и если что-то в моих рассуждениях не верно, то поправьте. Спасибо.

Источник: https://ru.stackoverflow.com/questions/621010/%D0%90%D1%83%D1%82%D0%B5%D0%BD%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F-%D0%B2-spring-security

Share

Тебе может это понравится...