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

542
30 января 2017, 16:51

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

Answer 1

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

READ ALSO
Правильно ли я делаю (ViewPager и RecyclerView)

Правильно ли я делаю (ViewPager и RecyclerView)

Просьба помочь с алгоритмом действийЕсть DrawerLayout по нажатию на его пункт отрывается фрагмент-1 в котором присутствует RecyclerView который выводит...

423
Прерывание цикла for с помощью break это плоxo?

Прерывание цикла for с помощью break это плоxo?

И снова я со своей книгой "Для про"Почему в цикле for не рекомендуется прерывание с помощью break? Как же тогда это сделать?

312
Кастомные кнопки bxslider

Кастомные кнопки bxslider

Не получается настроить свои кнопки для переключения слайдов в bxslider, а точнее иконки с FontAwesomeНеобходимо их сделать по центру слайда с отступами...

510
Получить значение радиокнопки

Получить значение радиокнопки

Есть такая верстка

388