高端网站建设哪家更专业,顺义的网站建设公司,wordpress网站500错误,怎么做网页代码文章目录 1、配置用户权限2、针对URL授权3、针对方法的授权 1、配置用户权限
继续上一章#xff0c;给在内存中创建两个用户配置权限。配置权限有两种方式#xff1a;
配置roles配置authorities
//哪个写在后面哪个起作用
//角色变成权限后会加一个ROLE_前缀#xff0c;比… 文章目录 1、配置用户权限2、针对URL授权3、针对方法的授权 1、配置用户权限
继续上一章给在内存中创建两个用户配置权限。配置权限有两种方式
配置roles配置authorities
//哪个写在后面哪个起作用
//角色变成权限后会加一个ROLE_前缀比如ROLE_teacher
UserDetails user2 User.builder().username(thomas).password(passwordEncoder().encode(123456)).authorities(teacher:add,teacher:update).roles(teacher).build();UserDetails user2 User.builder().username(thomas).password(passwordEncoder().encode(123456)).roles(teacher).authorities(teacher:add,teacher:update).build();
以上两种写法顺序不同获取当前登录用户时得到的权限值也不一样。总结就是
如果给一个用户同时配置roles和authorities哪个方法后面调用哪个起作用配置roles时权限名会加上ROLE_
当然从代码层来说角色和权限并没太大区别并特别是在Spring Security中。
2、针对URL授权
未做授权时默认登录成功的用户可以访问所有资源调任意一个接口但有的接口只能允许管理员调用因此这里需要再实现授权功能。先看针对URL授权即哪些权限可以访问哪些URL。新建配置类MyWebSecurityConfig继承抽象类WebSecurityConfigurerAdapter重写configure(HttpSecurity http)方法
Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests() //授权请求.anyRequest() //任何请求.denyAll(); //拒绝所有请求访问//.permitAll(); //允许所有请求}
}放开登录认证页面
Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests() //授权请求.anyRequest() //任何请求.denyAll(); //拒绝所有请求访问//.permitAll(); //允许所有请求http.formLogin().permitAll(); //放开表单登录}
}针对不同的url要求拥有不同的权限才能访问实现如下
Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().mvcMatchers(/student/**).hasAnyAuthority(ROLE_student, ROLE_teacher) //有任一权限就能访问上面的url形参是可变长字符串.mvcMatchers(/teacher/**).hasAuthority(ROLE_teacher) //必须有这个权限才能访问上面的url.anyRequest() //任何请求.authenticated(); //都需要登录即那些没有单独设置权限的url仅需登录就能访问http.formLogin().permitAll();}
}关于URL匹配可选框架中的以下方法
mvcMatchers() 优先regexMatchers()antMatchers()
关于校验是否有对应的权限框架中的方法可选
hasAuthority() 是否有单个权限hasRole()hasAnyAuthority() 是否有其中任一个权限hasAnyRole()
还可以.access()写表达式
.mvcMatchers(/admin/**)
.access(hasRole(teacher) or hasAuthority(admin:query))
//里面用单引号省的转义3、针对方法的授权
上面是URL级别的授权接下来进行方法级别的权限控制。先写一个增删改查的简单代码方便后面测试。 测试素材代码 //新建教师接口
public interface TeacherService {String add();String update();String delete();String query();
}
//实现接口
Service
Slf4j
public class TeacherServiceImpl implements TeacherService {Overridepublic String add() {log.info(添加教师成功);return 添加教师成功;}Overridepublic String update() {log.info(修改教师成功);return 修改教师成功;}Overridepublic String delete() {log.info(删除教师成功);return 删除教师成功;}Overridepublic String query() {log.info(查询教师成功);return 查询教师成功;}
}
简单补充下controller
RestController
RequestMapping(/teacher)
public class TeacherController {Resourceprivate TeacherService teacherService;GetMapping(/query)public String queryInfo() {return teacherService.query();}GetMapping(/add)public String addInfo() {return teacherService.add();}GetMapping(/update)public String updateInfo() {return teacherService.update();}GetMapping(/delete)public String deleteInfo() {return teacherService.delete();}
}
配置类中新建三个测试用户在内存中
Configuration
public class MySecurityUserConfig {Beanpublic UserDetailsService userDetailService() {UserDetails user1 User.builder().username(liu).password(passwordEncoder().encode(123456)).roles(student).build();UserDetails user2 User.builder().username(Mr.liu).password(passwordEncoder().encode(123456)).roles(teacher).build();UserDetails user3 User.builder().username(admin).password(passwordEncoder().encode(123456)).authorities(teacher:add, teacher:update).build();//创建两个用户InMemoryUserDetailsManager userDetailsManager new InMemoryUserDetailsManager();userDetailsManager.createUser(user1);userDetailsManager.createUser(user2);return userDetailsManager;}/** 从 Spring5 开始强制要求密码要加密* return*/Beanpublic PasswordEncoder passwordEncoder(){//使用加密算法对密码进行加密return new BCryptPasswordEncoder();}}
Web安全配置适配器类
Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {Overrideprotected void configure(HttpSecurity http) throws Exception {//任何访问均需要认证http.authorizeRequests().anyRequest().authenticated();http.formLogin().permitAll();}
} 进行方法级别的控制 首先加上启动全局方法安全的注解 EnableGlobalMethodSecurity(prePostEnabled true)
//Configuration
//EnableGlobalMethodSecurity注解中有Configuration注解所以这里注掉了就
EnableGlobalMethodSecurity(prePostEnabled true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {Overrideprotected void configure(HttpSecurity http) throws Exception {//任何访问均需要认证http.authorizeRequests().anyRequest().authenticated();//登录放行http.formLogin().permitAll();}
}
EnableGlobalMethodSecurity(prePostEnabled true)中的prePostEnabled是预授权和后授权预授权即访问前判断有无权限后授权则是方法执行完以后才判断是否有权限后授权的使用场景比较少。接下来修改要控制访问的方法使用 前置授权注解PreAuthorize
Service
Slf4j
public class TeacherServiceImpl implements TeacherService {OverridePreAuthorize(hasAuthority(teacher:add) OR hasRole(teacher))public String add() {log.info(添加教师成功);return 添加教师成功;}OverridePreAuthorize(hasAuthority(teacher:update))public String update() {log.info(修改教师成功);return 修改教师成功;}OverridePreAuthorize(hasAuthority(teacher:delete))public String delete() {log.info(删除教师成功);return 删除教师成功;}OverridePreAuthorize(hasRole(teacher))public String query() {log.info(查询教师成功);return 查询教师成功;}
}
此时登录有不同权限的不同角色其只能访问对应有权限的方法。 注意这里控制的是对方法的访问仅仅是限制对方法的访问。 GetMapping(/delete)public String deleteInfo() {return teacherService.delete();}改为 GetMapping(/delete)public String deleteInfo() {int a 10log.info(进入了TeacherControllera{} , a);return teacherService.delete();}登录学生账户访问delete接口此时结果仍然403但控制台可以看到在到达被限制权限的方法前的代码是可以访问的 当然PreAuthorize注解也可以写在Controller中的方法上此时上面的int a 10自然就访问不到了。 小总结