Spring Security,注释@Secured 不起作用

Posted

技术标签:

【中文标题】Spring Security,注释@Secured 不起作用【英文标题】:Spring Security, annotation @Secured is not working 【发布时间】:2021-09-27 19:28:03 【问题描述】:

我正在使用 Spring MVC

@Secured 注释不起作用。

我尝试了很多选项,但似乎没有任何效果。告诉我,我做错了什么

我正在查看此页面 - Spring Security, Method Security annotation (@Secured ) is not working (java config) 它对我没有帮助。

。 . .

这是我的 github 代码。 https://github.com/MyTestPerson/securede

Personal.class

    @Controller
    public class Personal 


        @GetMapping(value = "/personal")
        public ModelAndView personalGet () 

            ModelAndView modelAndView = new ModelAndView("/personal");

            modelAndView.addObject("msg", myMsg());

            return modelAndView;

        



        @Secured(value = "ROLE_ADMIN")
        private String myMsg() 

            return "Hello USER!!!";

        

    

SecurityConfig.class

    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter 


        @Autowired
        UserDetailsService userDetailsService;


        @Autowired
        public void configure(AuthenticationManagerBuilder auth) throws Exception 
            auth.userDetailsService(userDetailsService).passwordEncoder(new BCryptPasswordEncoder());
        


        @Override
        protected void configure(HttpSecurity http) throws Exception 

            http

                    .authorizeRequests()
                    .mvcMatchers("/").permitAll()
                    .mvcMatchers("/personal/**").hasAnyRole("ADMIN","USER")
                    .mvcMatchers("/login").anonymous()
                    .anyRequest()
                    .authenticated()

                    .and()
                    .formLogin()

                    .and()
                    .logout()
                    .logoutUrl("/logout")
                    .logoutSuccessUrl("/")
                    .deleteCookies("JSESSIONID")
                    .invalidateHttpSession(true);


        


    

RootConfig.class

    @EnableWebMvc
    @Configuration
    @ComponentScan("com.securede.security")
    @EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true, jsr250Enabled = true)
    public class RootConfig implements WebMvcConfigurer 

        @Bean
        public PasswordEncoder encoder() 
            return new BCryptPasswordEncoder();
        
    

UserDetail.class

    @Service
    public class UserDetail implements UserDetailsService 

        @Autowired
        PasswordEncoder passwordEncoder;


        @Override
        public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException 

            return new org.springframework.security.core.userdetails.User(
                    "user",
                    passwordEncoder.encode("user"),
                    true,
                    true,
                    true,
                    true,
                    getAuthorities());
        

        private Collection<? extends GrantedAuthority> getAuthorities()

            List<SimpleGrantedAuthority> authList = new ArrayList<>();
            authList.add(new SimpleGrantedAuthority("ROLE_USER"));

            return authList;

        

            

【问题讨论】:

【参考方案1】:

当你调用 secured 方法时

modelAndView.addObject("msg", myMsg());

你实际上是在调用本地方法(就像你在调用this.myMsg()一样),完全绕过了Spring Security的注解处理。

如果您将myMsg() 方法移至服务层(即在UserDetailsService 中),您可以实现您的目标,将其注入您的控制器,然后调用该方法:


@Controller
public class Personal 


    @Autowired
    UserDetailsService userDetailsService;

    @GetMapping(value = "/personal")
    public ModelAndView personalGet () 

        ModelAndView modelAndView = new ModelAndView("/personal");
        modelAndView.addObject("msg", userDetailsService.myMsg());
        return modelAndView;

    



【讨论】:

正确:也看看***.com/a/4396530/280244 - 这个答案是为交易而写的,但对于安全性也是如此【参考方案2】:

为了实现你想要的,你也可以在控制器方法级别使用@PreAuthorization注解。 示例:

@PreAuthorization("hasRole('ROLE_ADMIN')") 
@GetMapping(value = "/personal")
public ModelAndView personalGet () ..

Spring 不能在私有方法上应用基于注释的逻辑。

【讨论】:

以上是关于Spring Security,注释@Secured 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Spring Security 中获取 @Secured Method Security 注释

Spring Security,注释@Secured 不起作用

使用 Spring Security 的 @PreAutorize 注释问题

Spring security:使用注释强制 https?

Spring Security:方法不受 @PreAuthorize 注释的保护

Spring Security - 我如何启用方法安全注释?