Я написал приложение с использованием spring boot. Добавил авторизацию:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/","/registration", "/main").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.permitAll();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.jdbcAuthentication()
.dataSource(dataSource)
.passwordEncoder(NoOpPasswordEncoder.getInstance())
.usersByUsernameQuery("select username, password, active from users where username = ?")
.authoritiesByUsernameQuery("select u.username, ur.roles from users u inner join user_roles ur on u.id = ur.user_id where u.username=?");
}
Использую freemarker и на одной из ftl страниц написал кнопку logout:
<div>
<form action="/logout" method="post">
<div><input type="hidden" name="_csrf" value="${_csrf.token}"/></div>
<input type="submit" value="Log Out"/>
</form>
</div>
Проблема такая: когда я совершаю логаут, меня перекидывает на такой адрес - localhost/login?logout
. И если я попытаюсь снова залогиниться, то меня выкидывает в корень, который у меня не замапен в контроллерах(localhost/), а я хотел бы, чтобы я просто мог снова залогиниться и пройти дальше. Если я руками в адресной строке пропишу нужный мне адрес, то потом я могу нормально логиниться. Как можно сделать редирект на нужный мне адрес, после того как я разлогиниваюсь?
.logout()
.logoutSuccessUrl("/")
Я заметил у вас проблема и с логином какие-то? В общем у меня есть примерчик... В конфиге:
@Override
protected void configure(HttpSecurity http) throws Exception {
String[] matchers = {"/", "/ua", "/en", "/css/**", "/js/**", "/lib/**", "/img/**", "/user", "/en/seance/*", "/ua/seance/*"};
http
.authorizeRequests()
.antMatchers(matchers).permitAll().anyRequest().authenticated()
.and()
.formLogin()
.usernameParameter("email")
.loginProcessingUrl("/login")
.failureHandler(new SimpleUrlAuthenticationFailureHandler())
.permitAll()
.and()
.exceptionHandling()
.authenticationEntryPoint(getAuthenticationEntryPoint())
.and()
.logout()
.logoutSuccessUrl("/?logout")
.logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
.permitAll();
}
private AuthenticationEntryPoint getAuthenticationEntryPoint() {
return new AuthenticationEntryPoint() {
@Override
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {
response.sendError(HttpStatus.UNAUTHORIZED.value(), HttpStatus.UNAUTHORIZED.toString());
}
};
}
Форма которая в шапке сайта и выпадает в модальном окне (см. Bootstrap Modal Form). Также там Thymeleaf, но думаю вы его адаптируете под Freemarker:
<form method="POST" action="/login" id="login-form" class="needs-validation" novalidate>
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}" />
<div class="alertify-log alertify-log-error alertify-log-show"
style="display:none;margin-top:0">
[[ #{login.invalid} ]]
</div>
<div class="md-form form-sm">
<i class="fas fa-envelope prefix active"></i>
<input type="text" name="email" id="form2" class="form-control form-control-sm"
required>
<label for="form2" class="active">[[ #{login.email} ]]</label>
<div class="invalid-feedback">
[[ #{login.email.invalid} ]]
</div>
</div>
<div class="md-form form-sm">
<i class="fas fa-lock prefix"></i>
<input type="password" name="password" id="form3"
class="form-control form-control-sm" required>
<label for="form3">[[ #{login.password} ]]</label>
<div class="invalid-feedback">
[[ #{login.password.invalid} ]]
</div>
</div>
<div class="text-center mt-4">
<button type="submit" class="btn btn-info waves-effect waves-light">
[[ #{login} ]]
<i class="fas fa-sign-in ml-1"></i>
</button>
</div>
</form>
Обработчик формы на JS (Ajax/Jquery):
$('#login-form').submit(function (event) {
event.preventDefault(); // Cancel
var form = $(this);
if (form[0].checkValidity() === false) {
return;
}
var invalidData = form.find(".alertify-log-error");
var email = form.find('input[name="email"]');
var password = form.find('input[name="password"]');
var _csrf = form.find('input[name="_csrf"]');
var data = {
email: email.val(),
password: password.val(),
_csrf: _csrf.val()
};
$.ajax({
data: data,
timeout: 1000,
type: 'POST',
url: '/login'
}).done((responseText, statusText, response) => {
invalidData.hide();
window.location.href = "/?logged";
}).fail((response, statusText) => {
password.val('');
invalidData.show();
});
});
Ну а кнопка логаута выглядит как-то так тоже в шапке сайта:
<a sec:authorize="isAuthenticated()" class="dropdown-item logout" href="/logout">[[#{logout}]]</a>
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Есть основной класс Main и класс Person в классе Person есть метод draw(), что-бы исползовать этот метод в классе Main надо создать объект Person maks = new Person()...
Задача на java: написать программу, что будет выводить все дни твоего рождения на 5 лет вперед двумя способами: просто все в main, что изи, и с помощью...
Метод fillInStackTrace(), реализованный в классе Throwable позволяет получить объект типа Throwable, с сохранением трассировки стека вызывающего объекта...
Нужен наиболее простой способ вызвать NullPointerException