как обрабатывать направления API и URL (форма входа) в рамках одного проекта? - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть приложение, которое должно обрабатывать как 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, так и вход в систему на основе форм и их перенаправления в одном веб-приложении?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...