Я использую Spring Security, HTML и thymeleaf, и я хотел бы получить пользователя, у которого не удалось войти в систему. Вход в систему имеет два шага: первый шаг проверяет правильность ввода пароля пользователя и пароля в LDAP, второй проверяет, имеет ли пользователь роль в базе данных. Только если оба передаются, пользователь аутентифицируется. Теперь я хотел бы, чтобы на мою страницу регистрации был пользователь, у которого не удалось войти в систему (предварительно скомпилированное поле ввода). Страница регистрации - accessDeniedPage. Это аутентификация:Spring Security: как получить имя пользователя для доступа к DeniedPage?
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
Set<GrantedAuthority> authorities = new HashSet<GrantedAuthority>();
String name = authentication.getName();
String password = authentication.getCredentials().toString();
if (name == null || name.isEmpty() || password == null || password.isEmpty())
return null;
boolean isFind = ldapServices.ldapSearch(name, password);
if (isFind){
com.domain.User user = userServices.getByUsersEnabled(name);
if (user!=null){
authorities.add(new SimpleGrantedAuthority("ROLE_"+user.getRole().getRole()));
}
return new UsernamePasswordAuthenticationToken(user, password, authorities);
}
else return null;
}
и редирект:
@Override
protected void configure(HttpSecurity http) throws Exception {
List<Role> roles=roleServices.getRoles();
//Retrieve array of roles(only string field without id)
String[] rolesArray = new String[roles.size()];
int i=0;
for (Role role:roles){
rolesArray[i++] = role.getRole();
}
http
.authorizeRequests() //Authorize Request Configuration
//the "/register" path are accepted without login
.antMatchers("/registration/**").authenticated()
//all the path need authentication
.anyRequest().hasAnyRole(rolesArray)//.authenticated()
.and()//Login Form configuration for all others
.formLogin()
.loginPage("/login")
.permitAll()
.and()
//redirect on page "registration" if user doens't exist in DART database
.exceptionHandling().accessDeniedPage("/registration")
.and()
.logout()
.logoutSuccessUrl("/login?logout")
.deleteCookies("JSESSIONID", "JSESSIONID")
.invalidateHttpSession(true)
.permitAll();
}
Если добавить принципала в мой контроллер/регистрации является нулевым. Зачем? Принципал null, возможно, что-то не так в методе проверки подлинности. Кроме того, у меня может возникнуть проблема с безопасностью, так как мои веб-службы регистрации не аутентифицированы, тогда как они должны быть аутентифицированы без какой-либо роли. Есть ли возможность иметь на странице регистрации пользователя, который не смог войти в систему? Благодаря
На мой взгляд, ваш последний вопрос - это да. По умолчанию, если какой-либо пользователь зарегистрировался и если у этого пользователя нет доступа к любой странице, вы можете получить информацию о пользователе от Principal. –
Principal return null, я также пробовал с пользователем @AuthenticationPrincipal User и с sec: authentication = "main.username" в HTML-коде, все они равны нулю – luca
Я понял из вашего conf conf безопасности, если любой зарегистрированный пользователь хочет открыть страницу регистрации вы хотите показать, что у вас нет доступа к этой странице. Это правда? –