2016-10-29 5 views
0

Я пытаюсь настроить Spring Security в моем приложении Spring Boot, чтобы разрешить определенным пользователям доступ к определенным URL-адресам, если они имеют определенную роль, то есть роль пользователя или администратора, которую я сохраняю при создании моего пользователя. Я просмотрел несколько примеров here, которые в значительной степени выполняют то, что я ищу. Я немного запутался в интерфейсе Spring UserDetailsService и как я должен передать имя пользователя от своего пользователя до UserDetailsService при попытке получить доступ к URL-адресу, например localhost:8080/addtour. На данный момент мой код выглядит следующим образом:Spring's UserDetailsService

@Data 
@Scope("session") 
public class User { 

    @Id 
    private String id; 
    private String userName; 
    private String password; 
    private List<Role> roles; 

Мой SecurityConfig класс:

@Configuration 
@EnableWebSecurity 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 

     http 
     .formLogin() 
      .loginPage("/login") 
      .permitAll() 
      .and() 
     .exceptionHandling() 
      .accessDeniedPage("/accessdenied") 
      .and() 
     .authorizeRequests() 
      .antMatchers("/resources/**", "/signup", "/search").permitAll() 
      .antMatchers("/viewtour").hasAnyRole("USER", "ADMIN") 
      .antMatchers("/addtour").hasAnyRole("ADMIN") 
      .and() 
     .logout() 
      .permitAll() 
      .logoutSuccessUrl("/index.html"); 
    } 

    @Override 
    protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
     auth.userDetailsService(new UserDetailServiceImpl()); 
    } 

UserDetailServiceImpl, который реализует Пружины UserDetailService:

public class UserDetailServiceImpl implements UserDetailsService { 

    @Autowired 
    private UserService userService; 

    @Override 
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { 
     try { 
      User user = userService.retrieveUserByUserName(username); 
      if (user == null) { 
       return null; 
      } 
      return new org.springframework.security.core.userdetails.User(user.getUserName(), user.getPassword(), getAuthorities(user)); 
     } catch (Exception e){ 
      throw new UsernameNotFoundException("User not found"); 
     } 
    } 

    private Set<GrantedAuthority> getAuthorities(User user){ 
     Set<GrantedAuthority> authorities = new HashSet<GrantedAuthority>(); 
     for (Role role : user.getRoles()) { 
      GrantedAuthority grantedAuthority = new SimpleGrantedAuthority(role.toString()); 
      authorities.add(grantedAuthority); 
     } 
     System.out.println("user authorities are " + authorities.toString()); 
     return authorities; 
    } 

Мои Войти Страница помощью Thymeleaf:

<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-spring4-4.dtd"> 
 
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"> 
 
<head> 
 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
 
<link rel="stylesheet" type="text/css" href="css/style.css"/> 
 
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" /> 
 
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap-theme.min.css" /> 
 

 
</head> 
 
<body> 
 
\t <div> 
 
\t \t <div class="content"> 
 
\t \t \t <form action="#" th:action="@{/login}" th:object="${user}" method="post"> 
 
\t \t \t \t <div class="panel panel-default"> 
 
\t \t \t \t \t <br /> 
 
\t \t \t \t \t <h1 class="panel-title header-tab"> 
 
\t \t \t \t \t \t Login or <a href="/signup.html">Sign Up Here</a> 
 
\t \t \t \t \t </h1> 
 
\t \t \t \t \t <br /> 
 
\t \t \t \t \t <div class="panel-body"> 
 
\t \t \t \t \t \t <div class="form-group"> 
 
\t \t \t \t \t \t \t <label for="inputEmail" class="control-label col-xs-5">Username 
 
\t \t \t \t \t \t \t \t or Email</label> 
 
\t \t \t \t \t \t \t <div class="col-xs-7"> 
 
\t \t \t \t \t \t \t \t <input type="text" class="form-control" id="inputUsername" th:field="*{userName}" placeholder="Username or Email" /> 
 
\t \t \t \t \t \t \t </div> 
 
\t \t \t \t \t \t </div> 
 
\t \t \t \t \t \t <br/><br/> 
 
\t \t \t \t \t \t <div class="form-group"> 
 
\t \t \t \t \t \t \t <label for="inputPassword" class="control-label col-xs-5">Password</label> 
 
\t \t \t \t \t \t \t <div class="col-xs-7"> 
 
\t \t \t \t \t \t \t \t <input type="password" class="form-control" id="inputPassword" th:field="*{password}" placeholder="Password" /> 
 
\t \t \t \t \t \t \t </div> 
 
\t \t \t \t \t \t </div> 
 
\t \t \t \t \t \t <div class="form-group"> 
 
\t \t \t \t \t \t \t <div class="col-xs-offset-5 col-xs-10"> 
 
\t \t \t \t \t \t \t \t <div class="checkbox"> 
 
\t \t \t \t \t \t \t \t \t <label><input type="checkbox" />Remember Me</label> 
 
\t \t \t \t \t \t \t \t </div> 
 
\t \t \t \t \t \t \t </div> 
 
\t \t \t \t \t \t </div> 
 
\t \t \t \t \t \t <div class="form-group"> 
 
\t \t \t \t \t \t \t <div class="col-xs-offset-5 col-xs-7 btn-lg"> 
 
\t \t \t \t \t \t \t \t <input type="submit" value="Sign In" class="btn btn-primary btn-block"/> 
 
\t \t \t \t \t \t \t </div> 
 
\t \t \t \t \t \t </div> 
 
\t \t \t \t \t </div> 
 
\t \t \t \t </div> 
 
\t \t \t </form> 
 
\t \t </div> 
 
\t </div> 
 
</body> 
 
</html>

+1

Да, когда я ударил «http: // localhost: 8080/addtour», он перенаправляет меня на «http: // localhost: 8080/login», где я могу ввести свое имя пользователя и пароль. Когда положить точку останова в строке userService.retrieveUserByUserName в методе loadUserByUsername(), имя пользователя равно Null, поэтому я не уверен, что я что-то неправильно настраиваю или просто ничего не настраиваю – user676567

+0

Я изменил имя пользователя/значения пароля в моей форме входа, и это сработало! Спасибо за помощь! – user676567

ответ

1

Имена параметров в странице входа неверны, см

  • FormLoginConfigurer#usernameParameter:

    Параметр HTTP для поиска имени пользователя при выполнении аутентификации. По умолчанию используется «имя пользователя».

  • FormLoginConfigurer#passwordParameter:

    Параметр HTTP для поиска пароля при выполнении аутентификации. По умолчанию используется пароль.

Изменение названия параметра в вашей странице входа или изменить имена в вашем SecurityConfig.

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