SpringBoot - Spring Security详解(二)

应用场景

使用Spring Security完成基于内存增加多个用户,不同的用户有不同的角色,不同的角色有不同的访问权限的场景

具体步骤

①. 用户以及角色的配置
②. 配置URL的访问权限
③. 配置方法对应的URL
通过以上三步即可完成该场景的功能,前两步通过扩展自定义WebSecurityConfigurerAdapter即可完成。

自定义WebSecurityConfigurerAdapter

@Configuration
public class MyWebSecurityConfig extends WebSecurityConfigurerAdapter {
    // ①.	用户以及角色的配置
    // 创建admin、root和zhangsan两个用户;
    // admin的角色是:ADMIN 和 USER;root的角色是ADMIN 和 LEAD;
    // zhangsan的角色是:USER
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .withUser("admin").password("123456").roles("ADMIN","USER")
                .and()
                .withUser("root").password("123456").roles("ADMIN","LEAD")
                .and()
                .withUser("zhangsan").password("123456").roles("USER");
    }

	// ②.	配置URL的访问权限
	// 如果没有下面的配置,不同角色的访问权限是一样,所以需要进行配置
    @Override
    protected  void configure(HttpSecurity http) throws Exception {
    	// 开启HttpSecurity的配置
        http.authorizeRequests()
        	// admin/** 模式URL必须具备ADMIN角色
            .antMatchers("/admin/**").hasRole("ADMIN")
            // user/** 模式需要ADMIN或USER角色
            .antMatchers("/user/**").access("hasAnyRole('ADMIN','USER')")
            // dba/** 模式需要ADMIN和DBA角色
            .antMatchers("/dba/**").access("hasRole('ADMIN') and hasRole('DBA')")
            // 用户访问其它URL都必须认证通过后访问
            .anyRequest().authenticated()
            // 开启表单登录并配置登录接口
            // formLogin() 方法表示开启表单登录,即登录页面
            // loginProcessingUrl() 方法配置登录接口为"/login"。可以直接调用"/login"接口,
            // 发起一个POST请求进行登录,登录参数中用户名必须为 username,密码必须为 password,
            // 配置 loginProcessingUrl 接口主要是方便 Ajax 或者移动端调用登录接口。
            // permitAll() 表示和登录相关的接口都不需要认证就可以访问。
            .and().formLogin().loginProcessingUrl("/login").permitAll()
            // 关闭csrf
            .and().csrf().disable(); 
    }
}

测试

@RestController
public class MyWebSecurityConfigController {
 
    @GetMapping("/admin/say")
    public String say1() {
        return "HELLO, I'M A ADMIN.";
    }
 
    @GetMapping("/user/say")
    public String say2() {
        return "HELLO, I'M A USER.";
    }
 
    @GetMapping("/dba/say")
    public String say3() {
        return "HELLO, I'M A DBA.";
    }
 
    @GetMapping("/hello")
    public String say4() {
        return "HELLO, WORLD.";
    }
}

①. 使用admin登录,由于该用户具有 ADMIN 和USER 这两个角色,所以登录后可以访问/admin/say 、 /user/say 和 /hello这三个接口;
②. 使用zhangsan登录,由于该用户仅有USER 这两个角色,所以登录后可以访问/user/say 和 /hello这三个接口;

URL用户: admin用户:张三
/admin/say×
/user/say
/dba/say××
/hello
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cloneme01

谢谢您的支持与鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值