spring security鉴权方式

鉴权:及判断用户是否有访问接口的权利

Spring security提供了两种配置鉴权方式

1 在配置文件中配置

在SpringSecurityConfig中的 protected void configure(HttpSecurity http)方法中添加 

sys:user就是菜单表中的code字段

@Override
    protected void configure(HttpSecurity http) throws Exception {
        //调用验证码过滤器 下文会详细介绍
        http.addFilterBefore(imageCodeValidateFilter, UsernamePasswordAuthenticationFilter.class)
                .formLogin() // 表单登录方式
                .loginPage("/login/page") //登录页的页面地址
                .loginProcessingUrl("/login/form") // 登录表单提交处理url, 默认是/login
                .usernameParameter("username") //默认的是 username
                .passwordParameter("password")  // 默认的是 password
                .successHandler(customAuthenticationSuccessHandler) //登录成功返回的json
                .failureHandler(customAuthenticationFailureHandler) //登录失败返回的json
                .and() //每个类型的配置 以.and()间隔 相当于;
                .authorizeRequests() // 授权请求
                .antMatchers("/login/page",
                        "/code/image","/mobile/page", "/code/mobile",
                        "/code/image",
                        "/code/mobile",
                        "/mobile/page"
                ).permitAll() // 放行/login/page不需要认证可访问 因为如果在调用验证接口时还需要权限 那么就没有入口了 所以一些不需要登录就能访问的接口在此配置

                // 此处是鉴权
                // 有 sys:user 权限的可以访问任意请求方式的/role
                .antMatchers("/user").hasAuthority("sys:user")
                // 有 sys:role 权限的可以访问 get方式的/role
                .antMatchers(HttpMethod.GET,"/role").hasAuthority("sys:role")
                .antMatchers(HttpMethod.GET, "/permission")
                // ADMIN 注意角色会在前面加上前缀 ROLE_ , 也就是完整的是 ROLE_ADMIN, ROLE_ROOT
                .access("hasAuthority('sys:premission') or hasAnyRole('ADMIN', 'ROOT')")
                // 此处是鉴权


    }

2 在方法中加入注解提供 比较细腻

@PreAuthorize("hasAuthority('sys:user')")
@GetMapping(value = {"/", ""}) // /user/  /user
public String user() {
    return HTML_PREFIX + "user-list";
}


/**
 * 跳转到新增或者修改页面
 * @return
 */
// 有 'sys:user:add' 或 'sys:user:edit'权限 的用户可以访问
@PreAuthorize("hasAnyAuthority('sys:user:add', 'sys:user:edit')")
@GetMapping(value={"/form"}) // /user/form
public String form() {
   return HTML_PREFIX + "user-form";
}

// 返回值的code等于200,则调用成功有权限 ,否则把403
@PostAuthorize("returnObject.code == 200")
@RequestMapping("/{id}")  // /user/{id}
@ResponseBody
public MengxueguResult deleteById(@PathVariable Long id) {
    if(id < 0) {
        return MengxueguResult.build(500, "id不能小于0", id);
    }
    return MengxueguResult.ok();
}

// 过滤请求参数:filterTarget 指定哪个参数,filterObject是集合中的每个元素,
// 如果value表达式为true的数据则不会被过滤,否则 就过滤掉
@PreFilter(filterTarget = "ids", value = "filterObject > 0")
@RequestMapping("/batch/{ids}") // /user/batch/-1,0,1,2
@ResponseBody
public MengxueguResult deleteByIds(@PathVariable List<Long> ids) {
    return MengxueguResult.ok(ids);
}

// 过滤返回值:filterObject是返回值集合中的每一个元素,当表达式为true则对应元素会返回
@PostFilter("filterObject != authentication.principal.username")
@RequestMapping("/list")
@ResponseBody
public List<String> page() {
    List<String> userList = Lists.newArrayList("meng", "xue", "gu");
    return userList;
}

猜你喜欢

转载自blog.csdn.net/qq_20143059/article/details/113626150