# Spring-Security
**Repository Path**: hypocrite30/Spring-Security
## Basic Information
- **Project Name**: Spring-Security
- **Description**: Authentication & Authorization by Spring Security
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-03-23
- **Last Updated**: 2021-03-23
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# README
---
> 本项目基于`SpringBoot 2.0.9.RELEASE`版本, `JDK1.8` 开发
>
> 其他依赖版本请看 pom.xml 文件即可。
- 本项目主要内容为 登录、注销和根据权限展现动态表单,基于Spring-Security 实现。
- 登录账号密码在 config/SecurityConfig配置类 中可自定义
- 因为只是Spring Security学习Demo,没加上持久层的Dao编写,账号密码都固定写好的,仅供测试。
- 前端就不在此展示了,自行拉取跑一下就是了,主要是 Security 的后端 Demo 学习
### SpringSecurity 简介
满足:
- 功能权限
- 访问权限
- 菜单权限
不依赖框架,则要手动写 拦截器,过滤器,出现大量原生代码,冗余。
Apache Shiro 也是常见的 安全框架,SpringSecurity 完美兼容 SpringBoot,重点学习。
### 环境搭建
- 导入 `static` 里面的 `js` `css`.
- 导入 `templates` 里面的 `index.html` `level1 - 3`分别表示三种不同的权限,后面对权限加以控制。然后就是登录界面 `login.html`
- 导入 `pom.xml`依赖
```XML
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-starter-thymeleaf
org.springframework.boot
spring-boot-starter-security
org.thymeleaf.extras
thymeleaf-extras-springsecurity5
3.0.4.RELEASE
```
- `thymeleaf-extras-springsecurity5`是thymeleaf整合security的,官方的文档使用的是 `jsp`(老古董)。
- `application.properties`中关闭themeleaf缓存,便于测试
```properties
#关闭缓存
spring.thymeleaf.cache=false
```
- 到此基本的环境搭建完成,编写`RouterController`完成页面跳转,看能否正常进入对应页面跳转,用来检验环境搭建正常。
### SecurityConfig安全配置类
```java
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
}
```
- @EnableWebSecurity 开启WebSecurity模式
- WebSecurityConfigurerAdapter:自定义Security策略
- AuthenticaitonManagerBuilder:自定义人认证策略
Spring Security 两个主要目标是**“认证”**和**“授权”**(访问控制)。
认证:**Authentication**
授权:**Authorization**
> 官方文档:https://docs.spring.io/spring-security/site/docs/5.5.0-SNAPSHOT/reference/html5/#introduction
#### 授权:
```java
protected void configure(HttpSecurity http) throws Exception
```
- 该方法进行授权,将权限绑定到对应页面上去,这里给三个level文件夹下的文件绑定 3 种权限
```java
http.authorizeRequests()
.antMatchers("/").permitAll()
.antMatchers("/level1/**").hasRole("vip1")
.antMatchers("/level2/**").hasRole("vip2")
.antMatchers("/level3/**").hasRole("vip3");
```
- 采用链式编程。
- `permitAll()`开放全部权限,所有人可访问,一般就是首页。
- `hasRole()`进行授权命名。
```java
http.formLogin().loginPage("/toLogin").usernameParameter("user").passwordParameter("pwd").loginProcessingUrl("/login");
```
- `formLogin()`登录。查看源码上面的文档注释
> @Override
> protected void configure(HttpSecurity http) throws Exception {
> http.authorizeRequests().antMatchers("/**").hasRole("USER").and().formLogin()
> .usernameParameter("username") // default is username
> .passwordParameter("password") // default is password
> .loginPage("/authentication/login") // default is /login with an HTTP get
> .failureUrl("/authentication/login?failed") // default is /login?error
> .loginProcessingUrl("/authentication/login/process"); // default is /login
> // with an HTTP
> // post
> }
- 前端``对用name属性值默认为`username`,如果要修改则使用 `usernameParameter(newUsrName)`
- 前端``对用name属性值默认为`password`,如果要修改则使用 `passwordParameter(newPwd)`
- 默认登录路径为 `/login`,`loginProcessingUrl(diyUrl)`自定义登录路径。
- `loginPage`更改 Get 请求的登录界面。
- `failureUrl`更改登陆失败的界面。default:`/login?error`
```java
http.csrf().disable();
```
- CSRF:跨站请求伪造,Spring Security默认开启,可能会引起登出失败
```java
http.logout().logoutSuccessUrl("/");
```
- `logout()`实现注销功能。
- `logoutSuccessUrl()` 指定成功注销后跳到哪个页面
```java
http.rememberMe().rememberMeParameter("remember");
```
- 开启 "记住我" 功能 cookie默认保存两周
- `rememberMeParameter`更改前端 “记住我” checkbox 的 name 属性值。
#### 认证:
```java
protected void configure(AuthenticationManagerBuilder auth) throws Exception
```
- 用于认证,一般就是从数据库查询信息,然后倒回来认证。
```java
auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder()) //添加密码编码器,增加安全性,下列的密码都要编码
.withUser("cwh").password(new BCryptPasswordEncoder().encode("123123")).roles("vip2", "vip3")
.and() // 用 and 进行连接
.withUser("root").password(new BCryptPasswordEncoder().encode("123123")).roles("vip1", "vip2", "vip3")
.and()
.withUser("guest").password(new BCryptPasswordEncoder().encode("123123")).roles("vip1");
```
- 链式编程
- `BCryptPasswordEncoder`密码编码器,推荐使用的一种,也有其他的编码器,详细请看`public interface PasswordEncoder`的实现类。
- `roles()`添加上认证。
### 前端代码
```html
xmlns:sec="http://www.thymeleaf.org/extras/spring-security"
```
- 加上security命名空间
```
sec:authorize="!isAuthenticated()"
```
- 是否认证
```
sec:authorize="hasRole('vip1')
```
- 判断是否有该角色(有权限)
> 最后感谢:KuangStudy