как отправить неавторизованный ответ на аннотацию @CurrentUser - PullRequest
0 голосов
/ 17 марта 2019

как отправить неавторизованный ответ на аннотацию @CurrentUser У меня есть аннотация

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface CurrentUser {
    boolean required() default true;
}

есть преобразователь аргументов

public class CurrentUserIdMethodArgumentResolver extends AbstractCurrentUserMethodArgumentResolver<CurrentUserId> {
    public CurrentUserIdMethodArgumentResolver() {
        super(CurrentUserId.class, null);
    }

    @Override
    protected boolean isRequired(CurrentUserId annotation) {
        return annotation.required();
    }

    @Override
    protected Object resolveName(String name, MethodParameter parameter, NativeWebRequest request) throws Exception {
        return (getCurrentUser() != null)? getCurrentUser().getId() : null;
    }
}

настройка безопасности пружины

  @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                            .antMatchers(REACT_API_PERMITTED_URL, PERMITTED_SOCKET_PUBLIC_TOPIC, PERMITTED_SOCKET_ENDPOINT1, PERMITTED_SOCKET_ENDPOINT2).permitAll()
                            .antMatchers(SOCKET_PRIVATE_ENDPOINT, NOT_PERMITTED_SOCKET_ENDPOINT1, NOT_PERMITTED_SOCKET_ENDPOINT2).authenticated()
                            .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
                            .antMatchers("/moderator/**").access("hasRole('ROLE_MODERATOR')")
                            .anyRequest().authenticated()
                .and().headers()
                        .frameOptions().sameOrigin()
                .and().formLogin()
                        .loginPage(REACT_API_USER_LOGIN)
                        .permitAll()
                             .successHandler(successHandler)
                             .failureHandler(failureHandler)

                        .and().csrf().disable()
                .addFilterAfter(userFilter, LogoutFilter.class)
                .addFilterAfter(adminConfirmFilter, SwitchUserFilter.class)

                .logout()
                    .logoutUrl(REACT_API_USER_LOGOUT)
                    .logoutSuccessUrl(REACT_API)
                    .logoutSuccessHandler(defaultLogoutHandler)
                    .invalidateHttpSession(true)
                .permitAll();
    }

Iхочу в моем контроллере вернуться к HTTP.STATUS.una, авторизовав его, если пользователь не авторизован

 @GetMapping("/test")
 public User test(@CurrentUser User current) {
return current
}

Теперь у меня есть статус 400, BAD REQUEST, но я хочу настроить этот статус

Ответы [ 2 ]

0 голосов
/ 24 марта 2019

Я решил свой вопрос так:

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

    @Bean
    public CurrentUserMethodArgumentResolver userMethodArgumentResolver() {
        return new CurrentUserMethodArgumentResolver() {
            @Override
            protected Object resolveName(String name, MethodParameter parameter, NativeWebRequest request) throws Exception {
                SecurityContext securityContext = SecurityContextHolder.getContext();
                CurrentUser annotation = parameter.getParameterAnnotation(CurrentUser.class);
                boolean anonymousUser = securityContext.getAuthentication() instanceof AnonymousAuthenticationToken;
                if (annotation.required() && anonymousUser) {
                    throw new BadCredentialsException("access is denied");
                }
                return super.resolveName(name, parameter, request);
            }
        };
    }

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> list) {
        list.add(userMethodArgumentResolver());
        super.addArgumentResolvers(list);
}
0 голосов
/ 18 марта 2019

Spring уже имеет это, просто добавьте @EnableGlobalMethodSecurity(prePostEnabled = true) в вашу конфигурацию и аннотируйте ваш защищенный метод специальной аннотацией @PreAuthorize("isAuthenticated()") или @PreAuthorize("hasAnyRole('ADMIN)") и т. Д .:

@EnableGlobalMethodSecurity(prePostEnabled = true)
@Configuration
public class WebSecurityConf43547 extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
    ....
    }
}

и в вашем контроллере

@GetMapping("/test")
@PreAuthorize("isAuthenticated()") //this annotation better add to service method @Service
public String test() {
    return "abc"
}

или импорт org.springframework.security.core.Authentication;

@GetMapping("/test")
public String getOk(Authentication authentication) {
   return authentication.getName();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...