У меня есть приложение, которое должно обрабатывать как API, так и URL-адреса.
Я внедрил JWT для защиты моего API отдыха.
Конфигурация моей безопасности
@Override
protected void configure(HttpSecurity http) throws Exception {
http.cors().and().csrf().disable().
authorizeRequests()
.antMatchers(PUBLIC_MATCHERS).permitAll()
.antMatchers("/").permitAll()
.antMatchers("/newpage").permitAll()
.antMatchers("/admin").hasRole("ADMIN")
.antMatchers("/token/*", "/signup").permitAll()
.anyRequest().authenticated()
.and()
.formLogin().loginPage("/login").permitAll().failureUrl("/login?error")
.successHandler(securityHandler)
.and()
.logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
.logoutSuccessUrl("/?logout").deleteCookies("remember-me").permitAll()
.and()
.rememberMe()
.and()
.exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
http
.addFilterBefore(authenticationTokenFilterBean(), UsernamePasswordAuthenticationFilter.class);
}
MyController
@Controller
public class AuthController {
@GetMapping("/newpage")
public String newpage(){
return "newpage";
}
@GetMapping("/")
public String home(){
return "index";
}
@GetMapping("/admin")
public String admin(){
return "admin";
}
}
MyRestApiController
@CrossOrigin(origins = "*", maxAge = 3600)
@RestController
public class UserController {
@Autowired
private UserService userService;
//@Secured({"ROLE_ADMIN", "ROLE_USER"})
@PreAuthorize("hasRole('ADMIN')")
@RequestMapping(value="/users", method = RequestMethod.GET)
public List<User> listUser(){
return userService.findAll();
}
//@Secured("ROLE_USER")
@PreAuthorize("hasRole('USER')")
////@PreAuthorize("hasAnyRole('USER', 'ADMIN')")
@RequestMapping(value = "/users/{id}", method = RequestMethod.GET)
public User getOne(@PathVariable(value = "id") Long id){
return userService.findById(id);
}
@RequestMapping(value="/signup", method = RequestMethod.POST)
public User saveUser(@RequestBody UserDto user){
return userService.save(user);
}
@RequestMapping("/api/sample")
public Map<String,String> sample(){
Map<String,String> map = new HashMap<>();
map.put("sample","sample");
map.put("new","new");
return map;
}
}
SecurityHandler
@Component
public class SecurityHandler implements AuthenticationSuccessHandler {
@Value("sct.user")
String user1;
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
Set<String> roleSet = AuthorityUtils.authorityListToSet(authentication.getAuthorities());
if(roleSet.contains("ROLE_ADMIN")){
response.sendRedirect(request.getContextPath()+"/admin");
}else{
response.sendRedirect("/login");
}
}
}
поэтому в этом случае мой Restcontroller должен обрабатывать мой Rest Api, а обычный контроллер должен обрабатывать мои различные html-страницы.
Я применил аутентификацию JWT, поэтому всякий раз, когда я звоню /api/sample
, он запрашивает у меня токен, который соответствует ожиданиям.
когда я вхожу из формы и аутентификация прошла успешно, она должна перенаправить меня на страницу admin.html, но это не так. я получаю ошибку, которая говорит, что я не авторизован.
как мне обрабатывать как API, так и вход в систему на основе форм и их перенаправления в одном веб-приложении?