#spring-boot #spring-security #thymeleaf
#весенняя загрузка #spring-безопасность #thymeleaf
Вопрос:
WebSecurityConfiguration
@Configuration
@EnableWebSecurity
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
private BCryptPasswordEncoder bCryptPasswordEncoder;
@Autowired
private MyUserDetailsService userDetailsService;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth
.userDetailsService(userDetailsService)
.passwordEncoder(bCryptPasswordEncoder);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
String loginPage = "/login";
String logoutPage = "/logout";
http
.authorizeRequests()
.antMatchers("/").permitAll()
.antMatchers(loginPage).permitAll()
//.antMatchers("/registration").permitAll()
.antMatchers("/user/**").hasAnyAuthority("USER","ADMIN")
.anyRequest().authenticated()
.and()
.csrf().disable()
.formLogin()
.loginPage(loginPage)
.loginPage("/")
.failureUrl("/login?error=true")
.defaultSuccessUrl("/user")
.usernameParameter("username")
.passwordParameter("password")
.and()
.logout()
.logoutRequestMatcher(new AntPathRequestMatcher(logoutPage))
.logoutSuccessUrl(loginPage).and().exceptionHandling();
}
}
MyUserDetailsService
@Service
public class MyUserDetailsService implements UserDetailsService {
@Autowired
private UserService userService;
@Override
@Transactional
public UserDetails loadUserByUsername(String userName) {
User user = userService.findUserByUserName(userName);
List<GrantedAuthority> authorities = getUserAuthority(user.getRoles());
return buildUserForAuthentication(user, authorities);
}
private List<GrantedAuthority> getUserAuthority(Set<Role> userRoles) {
Set<GrantedAuthority> roles = new HashSet<>();
for (Role role : userRoles) {
roles.add(new SimpleGrantedAuthority(role.getRole()));
}
return new ArrayList<>(roles);
}
private UserDetails buildUserForAuthentication(User user, List<GrantedAuthority> authorities) {
return new org.springframework.security.core.userdetails.User(user.getUserName(), user.getPassword(),
user.getActive(), true, true, true, authorities);
}
}
Модель
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_id")
private long id;
@Column(name = "username")
private String userName;
@Column(name = "password")
private String password;
@Column(name = "active")
private Boolean active;
@ManyToMany(cascade = CascadeType.MERGE)
@JoinTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
private Set<Role> roles;
// getters and setters
}
@Entity
@Table(name = "roles")
public class Role {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "role_id")
private int id;
@Column(name = "role")
private String role;
// getters and setters
}
Я получил ошибку входа в систему безопасности Spring Boot. Я получил ошибку при входе в систему с ролью администратора. Но когда я вошел в роль пользователя, она работает хорошо. Я не понимаю, почему это происходит?
Когда я пытаюсь войти в систему как администратор, он перенаправляет меня http://localhost:8080/error
страница показывает это в теле:
{"timestamp":"2020-09-11T14:10:05.108 00:00","status":999,"error":"None","message":""}
Но при попытке входа в систему как пользователя все работает нормально.
Комментарии:
1. Какой URL вы вызываете?
2. Я позвонил
http://localhost:8080/login
3. Попробуйте добавить
permitAll()
в.formLogin()
.4. Я попытался добавить PermitAll (), но это выдает ошибку при входе в систему администратора
Ответ №1:
Возможно, вы напутали с antMatchers!!
В вашем коде, который вы упомянули, как
.antMatchers("/user/**").hasAnyAuthority("USER","ADMIN")
Это означает, что и пользователь, и администратор могут иметь доступ к URL, которые соответствуют «/ user /**», т.Е.. все URL-адреса с префиксом «/ user /»
Если у вас есть URL для администратора, который с «/ admin / * «, то вы также должны предоставить доступ к «/ admin /**»!
Затем вам нужно добавить еще один antMatcher, например
.antMatchers("/admin/**).hasRole("ADMIN")
который предоставит доступ только к URL-адресу администратора ie,. с префиксом «/ admin /**»