Я создаю загрузочное приложение Spring с использованием oauth, прямо сейчас у меня работает вход в систему github, но я хочу иметь приложение на основе ролей, поэтому доступ к некоторым маршрутам может быть доступен только для role_admin, а к другим - для role_user , я пробовал кое-что, и мой код выглядит немного беспорядочным, поэтому я ценю любую помощь!
Сейчас в классе CustomOAuth2User в методе getAuthorities отображается Set roles = getUserRoles(); как пустое, поэтому по умолчанию для всех пользователей используется роль role_user, поэтому я могу получить доступ к маршрутам, которым нужна такая роль, но не к маршрутам администратора, даже если я создаю пользователя с помощью role_admin.
SecurityConfig< /p>
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Autowired
private CustomOAuth2UserService oauthUserService;
@Autowired
private UserRepository userRepository;
@Autowired
private UserService userService;
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
return http
.authorizeHttpRequests(auth -> {
auth.requestMatchers(HttpMethod.GET, "/userinfo").hasRole("ADMIN");
auth.requestMatchers(HttpMethod.GET, "/").hasRole("USER");
auth.anyRequest().authenticated();
})
.oauth2Login(oauth2 -> oauth2
.userInfoEndpoint(userInfo -> userInfo.userService(oauthUserService)).successHandler(new AuthenticationSuccessHandler() {
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
Authentication authentication) throws IOException, ServletException {
CustomOAuth2User oauthUser = (CustomOAuth2User) authentication.getPrincipal();
String github_id = oauthUser.getAttributes().get("id").toString();
Optional userExistOp = userRepository.findByIdentifier(github_id);
if(!userExistOp.isPresent()) {
//all user are saves with role User
UserDTO userDTO = new UserDTO(oauthUser.getName(),"username", oauthUser.getAttributes().get("id").toString(), oauthUser.getAttributes().get("avatar_url").toString(), Role.ADMIN);
userService.create(userDTO);
}
response.sendRedirect("/");
}
})
)
.build();
}
}
CustomOAuth2UserService
@Service
public class CustomOAuth2UserService extends DefaultOAuth2UserService {
@Override
public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {
OAuth2User user = super.loadUser(userRequest);
return new CustomOAuth2User(user);
}
}
CustomOauth2User
public class CustomOAuth2User implements OAuth2User {
private OAuth2User oauth2User;
public CustomOAuth2User(OAuth2User oauth2User) {
this.oauth2User = oauth2User;
}
@Override
public Map getAttributes() {
return oauth2User.getAttributes();
}
@Override
public Collection
Подробнее здесь: https://stackoverflow.com/questions/781 ... horization