Spring Security

简介

Spring Security是Spring家族中的一个组成框架,具有强大且高度可定制的身份验证和访问控制功能,致力于为Java应用程序提供身份的验证和授权

(先来一个小案例叭)

本人的环境如下

IDEA:2019.3.5

Maven: 3.6.3

JDK: 1.8

1.创建一个Maven项目

2.引入依赖

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-parent</artifactId>
<version>2.0.6.RELEASE</version>
</parent> <dependencies>
<!--spring boot web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <!--Spring Security-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
</dependencies>

3.创建启动类

@SpringBootApplication
public class SecurityApplication {
public static void main(String[] args) {
SpringApplication.run(SecurityApplication.class, args);
}
}

4.写一个测试方法(Controller层)

@RestController
@RequestMapping("/test")
public class SecurityController { @RequestMapping("sayHello")
public String sayHello() {
return "Hello Spring Security";
}
}

然后我们就可以启动我们的小demo啦,启动的时候输出控制台会打印Spring Security的登录密码(每次启动都会重新初始化),是由UUID生成的,用户名默认是user,输入用户名和密码,登录就成功啦。

5.修改登录的用户名和密码

在resources目录下创建一个配置文件application.properties(application.yml),

# 自定义 spring security用户名和密码
spring.security.user.name=huang
spring.security.user.password=123456

不想要Spring Security的登录也是可以去掉的(关闭验证),只要把Security的自动配置去掉就可以啦,在启动类的@SpringBootApplication注解中添加就好。

@SpringBootApplication(exclude = SecurityAutoConfiguration.class)

6.基于内存的用户信息

有时候我们的用户名和密码太多,写在配置文件中不好,可以把用户名和密码保存到内存中进行管理。

1)要写一个配置类

一个继承了 WebSecurityConfigurerAdapter抽象类的类,重写它的 config 方法,在方法里面添加用户

//添加为配置类(相当于spring的xml文件)
@Configuration
//开启Spring Security功能
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//加密
PasswordEncoder pe = passwordEncoder(); auth.inMemoryAuthentication()
.withUser("huangxc")
.password(pe.encode("123456"))
.roles();
auth.inMemoryAuthentication()
.withUser("xian")
.password(pe.encode("654321"))
.roles();
auth.inMemoryAuthentication()
.withUser("admin")
.password(pe.encode("admin"))
.roles();
}
}

这样当我们启动项目时,就可以使用config方法里面配置的用户名和密码了。如果你的Spring Security版本是5(现在只出到5)的话,是会报错的(java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"),原因是密码不能使用明文的方式,要进行加密。

配置类中加如下代码进行加密就好,PasswordEncoder是一个接口,有很多加密算法的子类,而 new BCryptPasswordEncoder就是其中一个。

    //把方法添加到spring容器中
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
2)对用户添加角色

在项目中,一个用户往往可以具有多个角色的权限,可以在添加用户的时候进行设置,在roles方法中添加角色(可以添加多个),我这里以添加两个为例。

配置类上面添加一个注解

//开启方法级别的认证
@EnableGlobalMethodSecurity(prePostEnabled = true)

控制器中写两个方法来测试一下

    @RequestMapping("commonUser")
//表示这个方法有两个角色
@PreAuthorize(value = "hasAnyRole('admin','normal')")
public String commonUser() {
return "Hello 只用户normal角色";
} @RequestMapping("adminUser")
//表示这个方法只拥有 admin 这个角色
@PreAuthorize(value = "hasAnyRole('admin'")
public String adminUser() {
return "Hello 用户 admin 和 normal两个角色";
}

@PreAuthorize:进行方法前的验证,比如我admin这个用户去进行登录,两个方法都可以访问,如果是 huangxc或者是xian这两个用户去访问,只能访问commonUser()这个方法(温馨提示:每次测试的时候记得要轻触缓存)。

最新文章

  1. I/O Techie 社区 --欢迎您的加入
  2. Rasterizer Stage(读书笔记3 --- Real-Time rendering)
  3. Cheatsheet: 2015 03.01 ~ 03.31
  4. C# 版dll 程序集合并工具
  5. js获取当前浏览器页面高度及宽度信息的方法
  6. HDU-1012(水题)
  7. G - 密码 kmp、贪心、manachar等等等等
  8. jquery插件讲解:轮播(SlidesJs)+验证(Validation)
  9. SDK Hello world(直接使用SDK封装)
  10. LeetCode #1 TwoSum
  11. SpringBoot整合Mybatis,多数据源,事务,支持java -jar 启动.
  12. java工具类(三)之生成若干位随机数
  13. qt界面操作
  14. Linux添加目录到环境变量以及添加sublime到环境变量
  15. C#深入多线程
  16. int -2147483648 ----- 2147483647
  17. AJAX 与 Python 后台通信
  18. SDUT3141:Count(哈希)好题
  19. halcon 数字转字符串实现循环读取图片
  20. WebBench----简洁优美的网站压力测试工具

热门文章

  1. 解决clipboard.js在移动端复制失败的问题
  2. 部署springboot时出现的问题
  3. etcd学习(3)-grpc使用etcd做服务发现
  4. noip模拟26[肾炎黄&#183;酱累黄&#183;换莫黄]
  5. py3射击小游戏
  6. php中英文字符串转字母转大小写
  7. 后台程序编译过程报错PCC-F-02104, Unable to connect to Oracle
  8. 如何区别php,jsp,asp,aspx随笔
  9. HCIA—(网络初相识)
  10. WPF 图表控件之曲线绘制与移动