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