spring-security记录笔记01

操作1:在pom中引入spring-security的支持

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
 </dependency>

什么都不做,现在启动系统会看到如下提示:

Using generated security password: e7da5da4-c93f-48a3-9616-e3d8f437a4df

随便找个controller写第一个hello world代码:

 @GetMapping("/sayHello")
    JsonResult sayHello(HttpServletRequest req)throws Exception{
        return new JsonResult(ResultCode.SUCCESS,"hello world");
    }

在浏览器访问:http://127.0.0.1/login
看到下边这个页面:
在这里插入图片描述
代表spring security已经生效

实验1:为你得security添加一个用户

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Bean
    PasswordEncoder PasswordEncoder(){
        return  NoOpPasswordEncoder.getInstance();
    }
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().withUser("admin").password("123").roles("admin")
                .and()
                .withUser("zhangsan").password("123").roles("user");
    }
}

继承了WebSecurityConfigurerAdapter这个类,重写其中的configure方法,这个方法有三个参数不同,我们先重写AuthenticationManagerBuilder 这个的

@Bean
PasswordEncoder PasswordEncoder(){
return NoOpPasswordEncoder.getInstance();
}

PasswordEncoder代表了security密码加密策略,我们现在使用NoOpPasswordEncoder(不采用任何加密的方式)
现在进入之前的

http://127.0.0.1/login

这个页面,就不需要输入系统输出的默认密码了,输入我们刚才设置的admin密码123,就可以登录了

***权限测试01:***在上边代码中我们加入了admin用户.roles(“admin”) 这个东西,代表给当前用户赋值角色为admin角色
而zhangsan用户赋值权限为user
注意:需要在刚才SecurityConfig中添加注解:

@EnableGlobalMethodSecurity(prePostEnabled=true)

我们在控制器层加入注解:

 @GetMapping("/sayHello")
    @PreAuthorize("hasRole('ROLE_admin')")
    JsonResult sayHello(HttpServletRequest req)throws Exception{
        return new JsonResult(ResultCode.SUCCESS,"hello world");
    }

@PreAuthorize(“hasRole(‘ROLE_admin’)”)

代表当前需要ROLE_admin角色才能访问(ROLE_是spring security默认自己加的,所有的角色都会默认添加这个前缀)
现在去访问,当张三登录的时候访问这个位置就会报错(因为我们没有做处理)
在这里插入图片描述
我们可以明确的看到其中错误code码为403,也就是访问权限被拒绝的意思

权限测试02
继续实现的configure方法,不同是这次里边的参数为:HttpSecurity http

 @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().antMatchers("/admin/**").hasRole("admin")
                .antMatchers("/sayHello").hasRole("admin")
                .and().httpBasic()
                .and().csrf().disable();
    }

我们首先删除方法上的注解:@PreAuthorize("hasRole('ROLE_admin')")
这样配置为当前系统如果访问/admin/**这种路径需要admin角色,如果访问/sayHello路径也需要admin橘色
当我们使用zhangsan用户登录的时候,我们发现也是被拦截的

权限测试03
我们编写三个测试访问方法

@GetMapping("/sayHello")
JsonResult sayHello(Principal principal)throws Exception{
    System.out.println(principal.getName());
    return new JsonResult(ResultCode.SUCCESS,"hello world");
}
@GetMapping("/admin/say")
JsonResult sayAd(Principal principal)throws Exception{
    System.out.println(principal.getName());
    return new JsonResult(ResultCode.SUCCESS,"admin");
}
@GetMapping("/say")
JsonResult say(Principal principal)throws Exception{
    System.out.println(principal.getName());
    return new JsonResult(ResultCode.SUCCESS,"say");
}

第一个访问路径为/sayHello 第二个访问路径是以/admin开头,第三个没有什么特殊的,对应我们刚在configure(HttpSecurity http) 配置的类容:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests().antMatchers("/admin/**").hasRole("admin")
            .antMatchers("/sayHello").hasRole("admin")
            .and().httpBasic()
            .and().csrf().disable();
}

这里我们添加用户的详情如下:

protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.inMemoryAuthentication().withUser("admin").password("123").roles("admin")
            .and()
            .withUser("zhangsan").password("123").roles("user");
}

这时候测试,使用admin用户登录,三个请求位置都能访问到,但是使用zhangsan用户登录,仅仅只有/say这个路径能访问到

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值