SpringSecurity最全实战讲解
⽂章⽬录
Spring Security 专题
⼀、基本概念
认证
⽤户认证就是判断⼀个⽤户的⾝份是否合法的过程,⽤户去访问系统资源时系统要求验证⽤户的⾝份信息,⾝份合法⽅可继续访问,不合法则拒绝访问。常见的⽤户⾝份认证⽅式有:⽤户名密码登录,⼆维码登录,⼿机短信登录,指纹认证等⽅式。
系统为什么要认证?
认证是为了保护系统的隐私数据与资源,⽤户的⾝份合法⽅可访问该系统的资源。
怎么进⾏认证?
授权
授权是⽤户认证通过后,根据⽤户的权限来控制⽤户访问资源的过程,拥有资源的访问权限则正常访问,没有权限则拒绝访问。
为什么要授权?
认证是为了保证⽤户⾝份的合法性,授权则是为了更细粒度的对隐私数据进⾏划分,授权是在认证通过后发⽣的,
控制不同的⽤户能够访问不同的资源。
会话
⽤户认证通过后,为了避免⽤户的每次操作都进⾏认证可将⽤户的信息保证在会话中。会话就是系统为了保持当前⽤户的登录状态所提供的机制,常见的有基于session⽅式、基于token⽅式等。
RBAC模型
主体 -》 ⾓⾊ -》 资源 -》⾏为
如何设计⼀个权限系统?
⼆、⼀个⾃⼰实现的权限模型 BasicAuth:
下⾯我们⾃⼰实现⼀个基于Session⽅式的RBAC模型的项⽬。
先创建⼀个maven⽗⼯程AuthDemo,管理maven版本。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="/POM/4.0.0"
xsi="/2001/XMLSchema-instance"
xsi="/2001/XMLSchema-instance"
schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion>
<groupId>com.tuling</groupId>
<artifactId>AuthDemo</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<properties>
<mavenpiler.source>1.8</mavenpiler.source>
<mavenpiler.target>1.8</mavenpiler.target>
<java.version>1.8</java.version>
<spring-boot-version>2.3.3.RELEASE</spring-boot-version>
<spring-cloud-version>Greenwich.RELEASE</spring-cloud-version>
</properties>
<modules>
<module>basicAuth</module>
</modules>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot-version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud-version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>javax.interceptor</groupId>
<artifactId>javax.interceptor-api</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-jwt</artifactId>
<version>1.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security.oauth.boot</groupId>
<artifactId>spring-security-oauth2-autoconfigure</artifactId>
<version>2.1.2.RELEASE</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
注:⽬前我们需要使⽤到的就是spring-boot-dependencies。其他依赖包含了后⾯⼏个部分需要的依赖版本,在这⾥⼀次全部引⼊。
然后我们创建⼀个basicAuth的⼦⼯程。⼦⼯程是采⽤SpringBoot⽅式快速搭建的伪前后端分离的项⽬。
项⽬整体机构如下:
pom依赖⾮常简单,只需要引⼊spring-boot-starter 和 spring-boot-starter-web两个依赖。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="/POM/4.0.0"
xsi="/2001/XMLSchema-instance"
schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd">
<parent>
<artifactId>AuthDemo</artifactId>
<groupId>com.tuling</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>basicAuth</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot-version}</version>
<configuration>
<mainClass>com.tuling.BasicAuthApplication</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
然后创建启动类
package com.tuling.basicAuth;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class BasicApplication {
public static void main(String[] args){
SpringApplication.run(BasicApplication.class,args);
}
}
以及springboot的配置⽂件 application.properties,我们只简单定义下接⼝server.port=8080
然后我们开始创建基于RBAC模型的三个关键实体
UserBean:
package com.tuling.basicAuth.bean;
import java.util.ArrayList;
import java.util.List;
public class UserBean {
private String userId;
private String userName;
private String userPass;
private List<RoleBean> userRoles =new ArrayList<>();
private List<ResourceBean> resourceBeans =new ArrayList<>();
public UserBean(){
}
public UserBean(String userId, String userName, String userPass){
this.userId = userId;
this.userName = userName;
this.userPass = userPass;w3mobile下载
}
...getter
public boolean havaPermission(String resource){
sourceBeans.stream()
.filter(resourceBean -> ResourceName().equals(resource))
.
count()>0;
}
}
RoleBean:
package com.tuling.basicAuth.bean;
import java.util.List;
public class RoleBean {
private String roleId;
private String roleName;
private List<ResourceBean> resources;
public RoleBean(){
}
public RoleBean(String roleId, String roleName){
}
... getter and setter ...
}
ResourceBean:
package com.tuling.basicAuth.bean;
/**
* Spring Security中,资源被简化成⼀个字符串。
* ⽽在⾃⼰设计资源时,可以设计不同类型的资源控制不同的⾏为。
* 例如菜单资源,Rest接⼝资源,页⾯控件资源等。
*/
public class ResourceBean {
private String resourceId;
private String resourceType;
private String resourceName;
public ResourceBean(){
}
public ResourceBean(String resourceId, String resourceName){
}
... getter and setter ...
}
然后我们定义三个Controller,其中MobileController和SalaryController就是需要控制权限的访问资源,LoginController就是登陆的⼊⼝。
MobileController:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论