2016-11-10 3 views
0

Я использую 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, возможно, что-то не так в методе проверки подлинности. Кроме того, у меня может возникнуть проблема с безопасностью, так как мои веб-службы регистрации не аутентифицированы, тогда как они должны быть аутентифицированы без какой-либо роли. Есть ли возможность иметь на странице регистрации пользователя, который не смог войти в систему? Благодаря

+0

На мой взгляд, ваш последний вопрос - это да. По умолчанию, если какой-либо пользователь зарегистрировался и если у этого пользователя нет доступа к любой странице, вы можете получить информацию о пользователе от Principal. –

+0

Principal return null, я также пробовал с пользователем @AuthenticationPrincipal User и с sec: authentication = "main.username" в HTML-коде, все они равны нулю – luca

+0

Я понял из вашего conf conf безопасности, если любой зарегистрированный пользователь хочет открыть страницу регистрации вы хотите показать, что у вас нет доступа к этой странице. Это правда? –

ответ

0

Я изменил эту строку в метод AUTHENTICATE:

return new UsernamePasswordAuthenticationToken(user==null?new User(name,null,false):user, password, authorities); 

Пользователь был нулевым, потому что он не существует в базе данных, поэтому обратный объект запроса пустым, вместо этого я должен создать пользователя с только имя пользователя.

Смежные вопросы