zoukankan      html  css  js  c++  java
  • Spring Security @PreAuthorize 拦截无效

    1. 在使用spring security的时候使用注解,@PreAuthorize("hasAnyRole('ROLE_Admin')")

    放在对方法的访问权限进行控制失效,其中配置如:

    @Configuration
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
     
        @Autowired
        UserDetailsService userDetailsService;
     
        @Bean
        @Override
        public AuthenticationManager authenticationManagerBean() throws Exception {
            return super.authenticationManagerBean();
        }
     
        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {
            auth.userDetailsService(userDetailsService);
        }
    @Override
    protected void configure(HttpSecurity http) throws Exception { http.csrf().disable() .authorizeRequests() .antMatchers("/res/**", "/login/login*").permitAll() .anyRequest().authenticated() .and().formLogin().loginPage("/login/login").defaultSuccessUrl("/") .passwordParameter("password") .usernameParameter("username") .and().logout().logoutSuccessUrl("/login/login"); } }

    Controller中的方法如下:

    @Controller
    @RequestMapping("/demo")
    public class DemoController extends CommonController{
        @Autowired
        private UserService userService;
     
        @PreAuthorize("hasAnyRole('ROLE_Admin')")
        @RequestMapping(value = "user-list")
        public void userList() {
             
        }
    }

    使用一个没有ROLE_Admin权限的用户去访问此方法发现无效。

    修改一下 SecurityConfig:

      @Override
       protected void configure(HttpSecurity http) throws Exception {
           http.csrf().disable()
               .authorizeRequests()
               .antMatchers("/res/**", "/login/login*").permitAll()
               .antMatchers("/demo/user-list").access("hasRole('ROLE_Admin')")
               .anyRequest().authenticated()
               .and().formLogin().loginPage("/login/login").defaultSuccessUrl("/")
                   .passwordParameter("password")
                   .usernameParameter("username")
               .and().logout().logoutSuccessUrl("/login/login");
       }

    添加上:  

    .antMatchers("/demo/user-list").access("hasRole('ROLE_Admin')")

    可以被正常拦截,说明是方法拦截没有生效。

    如果是基于xml,则需要在配置文件中加上:

    <security:global-method-security pre-post-annotations="enabled" proxy-target-class="true" />

    换成Annotation方式以后,则需要使用 @EnableGlobalMethodSecurity(prePostEnabled=true) 注解来开启。

    并且需要提供以下方法:

    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
      return super.authenticationManagerBean();
    }

    才可正常拦截。

  • 相关阅读:
    nsq main里面golang多个协程管理写法
    关于centos压测的问题
    Jaeger全链路go实现,包含http和消息队列的链式传递
    mstsc远程报:这可能是由于CredSSP 加密Oracle修正的两种完美解决方法
    Axure9:一键复制Iconfont图标到Axure的插件安装
    Axure9:导入阿里云DataV.GeoAtlas矢量地图到Axure
    Axure:编辑技巧:拖动复制、编组、组内选中、穿透选中、选中模式
    Axure学习一:打开软件,预览和生成HTML原型、安装Chrome插件
    Axure RP授权码
    vm 安装rethat和centos
  • 原文地址:https://www.cnblogs.com/ifindu-san/p/9882124.html
Copyright © 2011-2022 走看看