一、什么是Spring Security?
Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架,它是用于保护基于Spring的应用程序的实际标准 。
Spring Security是一个框架,致力于为JAVA应用程序提供身份验证和授权 。与所有Spring项目一样,Spring Security的真正强大之处在于可以轻松扩展以满足自定义要求 。
更多信息可以查看官网:https://spring.io/projects/spring-security
【一分钟带你了解下Spring Security】二、Spring Security的主要功能
- 认证:验证用户名和密码是否合法(是否系统中用户)
- 授权:是系统用户不代表你能使用某些功能,因为你可能没有权限
- 防御会话固定,点击劫持,跨站点请求伪造等攻击
- Servlet API集成
- 与Spring Web MVC的可选集成
新建一个SpringBoot的web项目spring-boot-security 。
案例1:接口不添加保护
pom文件中不引入Spring Security,然后新建一个controller:
@RestControllerpublic class AppController { @GetMapping("/hello") public String hello() { return "Hello,spring security!"; }}然后打开浏览器访问:http://localhost:8080/hello,成功后返回:
Hello,spring security!案例2:接口添加保护
- pom文件添加依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
- 访问接口
文章插图
要登录系统,我们需要知道用户名和密码,Spring Security默认的用户名是user,项目启动的时候会生成默认密码(在启动日志中可以看到),输入用户名和密码后就可以访问/hello接口了 。
当然也可以自定义用户名密码,在配置文件添加如下内容即可:
spring.security.user.name=java_suisuispring.security.user.password=123456四、自定义认证和授权
上面说过Spring Security的功能有“认证”和“授权”,下面通过一个简单的例子实现下自定义的认证和授权 。
假设系统中有两个角色:
- ADMIN 可以访问/admin下的资源
- USER 可以访问/user下的资源
- 新建一个配置类
WebSecurityConfig代码如下:
/** * 配置类 * @Author java_suisui * */@EnableWebSecurity@Configurationpublic class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { //配置内存中的 用户名、密码和角色 auth.inMemoryAuthentication().passwordEncoder(new MyPasswordEncoder()).withUser("user").password("123456").roles("USER"); auth.inMemoryAuthentication().passwordEncoder(new MyPasswordEncoder()).withUser("admin").password("123456").roles("ADMIN"); } @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/login").permitAll() .antMatchers("/user").hasRole("USER") //访问 /user这个接口,需要有USER角色 .antMatchers("/admin").hasRole("ADMIN") .anyRequest().authenticated() //剩余的其他接口,登录之后就能访问 .and() .formLogin().defaultSuccessUrl("/hello"); }}
- 创建PasswordEncorder的实现类
MyPasswordEncoder代码如下:
public class MyPasswordEncoder implements PasswordEncoder { @Override public String encode(CharSequence rawPassword) { return rawPassword.toString(); } @Override public boolean matches(CharSequence rawPassword, String encodedPassword) { return encodedPassword.equals(rawPassword); }}
- 登录验证
- 使用user登录,可以访问/user
- 使用admin登录,可以访问/admin
Whitelabel Error PageThis application has no explicit mapping for /error, so you are seeing this as a fallback.There was an unexpected error (type=Forbidden, status=403).Forbidden
推荐阅读
- 指纹解锁按键 带touch id的妙控键盘
- 关于大蒜,你了解多少?生吃好还是熟吃好?
- 戴脚链是不是不好 脚链为什么不能带
- 宝宝拉肚子带血粘液
- 梦见擤出很多浓稠鼻涕,鼻子通了 梦见擤出很多浓稠鼻涕带血丝
- 100m的路由器200m宽带 1000m宽带用什么路由器
- 梦见过世的人要带我走怎么破 梦见过世的人要带我走怎么解梦
- 业内,百万年薪招茶企老总 高薪不会带来茶价上涨
- 烟台,高利润带动种茶 产量高茶农却犯愁
- Python中并发请求创建文件夹带来的线程安全问题