1.说明
此处只做spring security 基于角色实现用户登录访问简单示,只为说明spring security的简单使用方法
基于权限实现用户登录访问简单示例 可以查看上一篇文章
地址:https://blog.csdn.net/qq_32224047/article/details/108597820
2.用户结构的RBAC权限模型
在任何有认证授权逻辑的系统,都需要决定用户的权限,RBAC(ROLE-BASED-ACCESS-CONTROLLER)基于角色的权限控制模型,应用最广泛.
基于权限控制,一旦用户权限发生迁移变动,变动内容次数过多,不利于系统的操作和管理.
3.代码示例
3.1项目结构
启动类代码参看示例二
3.2AdminController 中的代码,做访问跳转测试用
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class AdminController {
@RequestMapping("/admin/write")
public String write() {
return "写入数据";
}
@RequestMapping("/admin/update")
public String update() {
return "更新数据";
}
@RequestMapping("/admin/delete")
public String delete() {
return "删除数据";
}
@RequestMapping("/user/read")
public String read() {
return "读取数据,不需要权限";
}
@RequestMapping("/ther")
public String other() {
return "其他权限";
}
}
3.3MyWebSecurityConfig中的代码,相比于基于权限,这里创建guest和administrator2个角色
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.NoOpPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
@Configuration
@EnableWebSecurity
public class MyWebSecurityConfig
extends WebSecurityConfigurerAdapter {
//明文加密器,只需要在内存中有这个管理对象,如果不添加,从前端登录时会抛出异常
@Bean
public PasswordEncoder passwordEncoder(){
return NoOpPasswordEncoder.getInstance();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
// auth.userDetailsService(myUserDetailsService());
//auth可以决定user对象的来源,可以是内存,也可以是
//自定义从数据库读取的数据
auth.inMemoryAuthentication()
.withUser("user")
.password("123456")
.roles("guest");//底层ROLE_guest权限
//.authorities("read","ROLE_guest");
//roles 和authorities本质底层都是设置的权限
//在内存用户定义时,同时存在,下面的方法值会覆盖上面的
auth.inMemoryAuthentication()
.withUser("admin")
.password("123456")
//给admin 在添加一个guest 角色
.roles("administrator","guest");
//.authorities("read","write","delete","update","ROLE_administrator","ROLE_guest");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()// 开启权限控制,通过ANT规范,自定义逻辑
//基于角色的权限控制
.antMatchers("/admin/**").hasRole("administrator")
.antMatchers("/user/**").hasRole("guest")
.anyRequest()//任意请求
.authenticated();//必须经过认证 只要登陆就能访问
http.formLogin();//开启表单认证
http.httpBasic();//开启http 基本认证
}
}
3.4启动验证
访问正常
通过user登录write等权限就没有,这里不再详细的验证,详细的验证请参看示例二
如果既要使用权限,还要使用角色,那么在authorities中继续配置即可,前面是权限,后面部分就是添加的角色