鉴权:及判断用户是否有访问接口的权利
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;
}