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权限的用户去访问此方法发现无效。

    修改一下:

     @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();
    }

    至此可以正常拦截

  • 相关阅读:
    java序列化深拷贝【转】
    去除DedeCms 5.7后台版权广告链接的方法
    织梦DedeCMS首页调用单页文档内容的方法
    jquery插件lazyload.js延迟加载图片的使用方法
    把数据保存到数据库附加表 `dede_addonarticle` 时出错,请把相关信息提交给DedeCms官方。Duplicate entry
    js 对象方法、类方法、原型方法的区别;私有属性、公有属性、公有静态属性的区别
    JS中的prototype
    用css3制作旋转加载动画的几种方法
    sencha touch list(列表)、 store(数据源)、model(模型)详解
    webkit webApp 开发技术要点总结
  • 原文地址:https://www.cnblogs.com/ranger2016/p/3914146.html
Copyright © 2011-2022 走看看