能实现角色级权限:RBAC
功能级\数据级权限
基本配置 (只是用户登录就可以访问)
public class MyPasswordEncoder implements PasswordEncoder {
@Override
public String encode(CharSequence charSequence) {
return charSequence.toString();
}
@Override
public boolean matches(CharSequence charSequence, String s) {
return s.equals(charSequence.toString());
}
}
@Configuration
@EnableWebSecurity
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
public void configure(WebSecurity web) throws Exception {
//设置静态资源不要拦截
web.ignoring().antMatchers("/static/**","/templates/**","/"); //设置不拦截的请求
}
@Override
protected void configure(HttpSecurity http) throws Exception { //指定那些请求要被拦截
//设置登录,注销,表单登录不用拦截,其他请求要拦截
http.authorizeRequests().antMatchers("/").permitAll() //说明项目的主路径是允许直接访问的 项目的其他请求都是要经过验证的
.anyRequest().authenticated()
.and()
.logout().permitAll() //注销是任何权限都可以访问的
.and()
.formLogin();
http.csrf().disable(); //关闭csrf的认证
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//可以设置内存指定的登录的账号密码,指定角色
//不加.passwordEncoder(new MyPasswordEncoder())
//就不是以明文的方式进行匹配,会报错
auth.inMemoryAuthentication().withUser("admin").password("admin").roles("ADMIN"); // 指定账户名 密码和角色
//.passwordEncoder(new MyPasswordEncoder())。
//这样,页面提交时候,密码以明文的方式进行匹配。 才能够正常访问否则是访问不了的
auth.inMemoryAuthentication().passwordEncoder(new MyPasswordEncoder()).withUser("dlf").password("dlf").roles("dai");
}
}
controller
// @EnableGlobalMethodSecurity(prePostEnabled = true) 要在controller的上面加一个这个注解 才能够使下面的注解生效
// @PreAuthorize(“hasRole(‘ROLE_ADMIN’)”) //这个路径就是指定身份的人才能够访问 身份是ADMIN 必须要加一个ROLE_ 前缀
@PreAuthorize(“hasRole(‘ROLE_ADMIN’) or hasRole(‘ROLE_USER’)”) //也可以设定多种身份
@ResponseBody
@RequestMapping("/roleAuth")
public String rile() {
return “管理员权限”;
}
@PreAuthorize("#id<10") //用来限制传入的id必须小于10
@ResponseBody
@RequestMapping("/roleAuth")
public String rileValue(Integer id) {
return "管理员权限";
}
缺点**:在大数据量的情况下 几乎不可用**