6.1 cái gì là Spring Security
Spring Security, đây là một loại căn cứ vào Spring AOP cùng Servlet lọc khí an toàn dàn giáo. Nó cung cấp toàn diện an toàn tính giải quyết phương án, đồng thời ở Web thỉnh cầu cấp cùng phương pháp thuyên chuyển cấp xử lý thân phận xác nhận cùng trao quyền.
Nó là một cái công nhăng cường đại, nhưng độ cao định chế thân phận nghiệm chứng cùng an toàn tính dàn giáo, nó là bảo hộ căn cứ vào Spring ứng dụng trình tự thật khi tiêu chuẩn. Nó uy lực chân chính ở chỗ nó có thể thoải mái mà mở rộng lấy thỏa mãn yêu cầu.
6.1.2 chỉnh thể dàn giáo( tương đối quan trọng )
Này trung tâm chính là một tổ lọc khí liên, hạng mục khởi động sau sẽ tự động phối trí. Nhất trung tâm chính là Basic Authentication Filter dùng để chứng thực người dùng thân phận, một cái ở spring security trung một loại lọc khí xử lý một loại chứng thực phương thức
Spring Security chứng thực ( Authentication ) cùng trao quyền ( Authorization ) là tách ra
6.1.3 chứng thực ( Authentication ) cùng trao quyền ( Authorization ) khác nhau
Đơn giản tới nói
Chứng thực (Authentication):Ngươi là ai.
Trao quyền (Authorization):Ngươi có quyền hạn làm gì.
Hơi chút chính thức điểm ( dong dài điểm ) cách nói chính là:
Authentication ( chứng thực )Là nghiệm chứng ngài thân phận bằng chứng ( tỷ như username / người dùng ID cùng mật mã ), thông qua cái này bằng chứng, hệ thống có thể biết ngươi chính là ngươi, nói cách khác hệ thống tồn tại ngươi cái này người dùng. Cho nên, Authentication được xưng là thân phận / người dùng nghiệm chứng.
Authorization ( trao quyền )Phát sinh ởAuthentication ( chứng thực )Lúc sau. Trao quyền sao, quang xem ý tứ đại gia hẳn là liền minh bạch, nó chủ yếu chưởng quản chúng ta phỏng vấn hệ thống quyền hạn. Tỷ như có chút riêng tài nguyên chỉ có thể có riêng quyền hạn nhân tài có thể phỏng vấn tỷ như admin, có chút đối hệ thống tài nguyên thao tác tỷ như xóa bỏ, tăng thêm, đổi mới chỉ có thể riêng nhân tài có.
Phức tạp chuyên nghiệp cách nói
Chứng thực
Thân phận nghiệm chứng là về nghiệm chứng ngài bằng chứng, như username / người dùng ID cùng mật mã, lấy nghiệm chứng ngài thân phận. Hệ thống xác định ngài có phải là ngài theo như lời sử dụng bằng chứng. Ở công cộng cùng chuyên dụng internet trung, hệ thống thông qua đăng nhập mật mã nghiệm chứng người dùng thân phận. Thân phận nghiệm chứng thông thường thông qua username cùng mật mã hoàn thành, có khi cùng thân phận nghiệm chứng nhân tố kết hợp sử dụng, người sau chỉ chính là các loại thân phận nghiệm chứng phương thức.
Thân phận nghiệm chứng nhân tố quyết định hệ thống ở trao tặng phỏng vấn văn kiện cùng thỉnh cầu ngân hàng giao dịch ở ngoài bất luận cái gì nội dung phía trước nghiệm chứng người nào đó thân phận các loại yếu tố. Người dùng thân phận có thể thông qua hắn biết nói, hắn có được hoặc là hắn là cái gì tới xác định. Ở an toàn tính phương diện, cần thiết ít nhất nghiệm chứng hai cái hoặc sở hữu ba cái thân phận nghiệm chứng nhân tố, để trao tặng người nào đó phỏng vấn hệ thống quyền hạn.
Căn cứ an toàn cấp bậc, thân phận nghiệm chứng nhân tố khả năng cùng dưới chi nhất bất đồng:
Đơn nhân tốThân phận nghiệm chứng- đây là đơn giản nhất thân phận nghiệm chứng phương pháp, thông thường ỷ lại với đơn giản mật mã tới trao tặng người dùng đối riêng hệ thống ( như trang web hoặc internet ) phỏng vấn quyền hạn. Người này có thể chỉ sử dụng trong đó một cái bằng chứng thỉnh cầu phỏng vấn hệ thống lấy nghiệm chứng này thân phận. Đơn nhân tố thân phận nghiệm chứng nhất thường thấy thí dụ mẫu là đăng nhập bằng chứng, này chỉ yêu cầu nhằm vào username mật mã.
Song nhân tố thân phận nghiệm chứng- xem tên đoán nghĩa, nó là một cái hai bước nghiệm chứng quá trình, không chỉ có yêu cầu username cùng mật mã, còn cần người dùng biết đến đồ vật, lấy bảo đảm càng cao cấp bậc an toàn tính, tỷ như ATM dẫn chân, người dùng biết. Sử dụng username cùng mật mã cùng với thêm vào cơ mật tin tức, lừa gạt giả cơ hồ không có khả năng đánh cắp có giá trị số liệu.
Nhiều trọng thân phận nghiệm chứng- đây là tiên tiến nhất thân phận nghiệm chứng phương pháp, nó sử dụng đến từ độc lập thân phận nghiệm chứng phân loại hai cái hoặc càng nhiều cấp bậc an toàn tính tới trao tặng người dùng đối hệ thống phỏng vấn quyền hạn. Sở hữu nhân tố ứng lẫn nhau độc lập, lấy tiêu trừ hệ thống trung bất luận cái gì lỗ hổng. Cơ quan tài chính, ngân hàng cùng chấp pháp cơ cấu sử dụng nhiều nhân tố thân phận nghiệm chứng tới bảo hộ này số liệu cùng ứng dụng trình tự khỏi bị tiềm tàng uy hiếp.
Tỷ như, đương ngài đem ATM tạp đưa vào ATM cơ khi, máy móc sẽ yêu cầu ngài đưa vào ngài PIN. Ở ngài chính xác đưa vào dẫn chân sau, ngân hàng sẽ xác nhận ngài thân phận chứng minh nên tạp chân chính thuộc về ngài, hơn nữa ngài là nên tạp hợp pháp sở hữu giả. Thông qua nghiệm chứng ngài ATM tạp dẫn chân, ngân hàng trên thực tế sẽ nghiệm chứng ngài thân phận, này xưng là thân phận nghiệm chứng. Nó chỉ là xác định ngươi là ai, không có khác.
Trao quyền
Về phương diện khác, trao quyền phát sinh ở hệ thống thành công nghiệm chứng ngài thân phận sau, cuối cùng sẽ trao tặng ngài phỏng vấn tài nguyên ( như tin tức, văn kiện, cơ sở dữ liệu, tài chính, vị trí, cơ hồ bất luận cái gì nội dung ) hoàn toàn quyền hạn. Đơn giản tới nói, trao quyền quyết định ngài phỏng vấn hệ thống năng lực cùng với đạt tới trình độ. Nghiệm chứng thành công sau, hệ thống nghiệm chứng ngài thân phận sau, có thể trao quyền ngài phỏng vấn hệ thống tài nguyên.
Trao quyền là xác định trải qua thân phận nghiệm chứng người dùng hay không có thể phỏng vấn riêng tài nguyên quá trình. Nó nghiệm chứng ngài hay không có quyền trao tặng ngài phỏng vấn tin tức, cơ sở dữ liệu, văn kiện chờ tài nguyên quyền hạn. Trao quyền thông thường ở nghiệm chứng sau xác nhận ngài quyền hạn. Đơn giản tới nói, tựa như cho người nào đó phía chính phủ cho phép làm mỗ sự hoặc bất luận cái gì sự tình.
Tỷ như, nghiệm chứng cùng xác nhận tổ chức trung công nhân ID cùng mật mã quá trình xưng là thân phận nghiệm chứng, nhưng xác định cái nào công nhân có thể phỏng vấn cái nào tầng lầu xưng là trao quyền. Giả thiết ngài đang ở lữ hành hơn nữa sắp đăng ký. Đương ngài ở đăng ký trước đưa ra vé máy bay cùng một ít thân phận chứng minh khi, ngài sẽ thu được một trương đăng ký bài, chứng minh sân bay quản lý cục đã đối ngài thân phận tiến hành rồi thân phận nghiệm chứng. Nhưng kia không phải nó. Tiếp viên hàng không cần thiết trao quyền ngài bước lên ngài hẳn là cưỡi chuyến bay, làm ngài có thể tiến vào phi cơ bên trong và tài nguyên.
Đối hệ thống phỏng vấn chịu thân phận nghiệm chứng cùng trao quyền bảo hộ. Có thể thông qua đưa vào hữu hiệu bằng chứng tới nghiệm chứng phỏng vấn hệ thống bất luận cái gì nếm thử, nhưng chỉ có ở thành công trao quyền sau mới có thể tiếp thu. Nếu nếm thử đã thông qua thân phận nghiệm chứng nhưng chưa đạt được trao quyền, hệ thống đem cự tuyệt phỏng vấn hệ thống.
[ ngoại liên hình ảnh chuyển tồn thất bại, nguyên trạm khả năng có phòng trộm liên cơ chế, kiến nghị đem hình ảnh bảo tồn xuống dưới trực tiếp thượng truyền (img-Rc91EKRU-1667651390143)(C:\Users\MrLiu\Desktop\ huấn luyện chương trình học học tập \ bút ký \SpringBoot bút ký \img\b5.png)]
Trích yếu
Tuy rằng này hai cái thuật ngữ thường xuyên lẫn nhau kết hợp sử dụng, nhưng chúng nó khái niệm cùng hàm nghĩa hoàn toàn bất đồng. Tuy rằng này hai khái niệm đối với Web phục vụ cơ sở kết cấu quan trọng nhất, đặc biệt là ở trao tặng đối hệ thống phỏng vấn quyền hạn khi, lý giải về an toàn tính mỗi cái thuật ngữ là mấu chốt. Tuy rằng chúng ta đại đa số người đem một cái thuật ngữ cùng một cái khác thuật ngữ lẫn lộn, nhưng lý giải chúng nó chi gian mấu chốt khác nhau rất quan trọng, trên thực tế phi thường đơn giản. Nếu thân phận nghiệm chứng là ngài thân phận, tắc trao quyền là ngài có thể phỏng vấn cùng sửa chữa quyền hạn. Đơn giản tới nói, thân phận nghiệm chứng chính là xác định người nào đó hay không là hắn công bố người. Về phương diện khác, trao quyền là xác định hắn phỏng vấn tài nguyên quyền lợi.
Cử cái ví dụ tới nói:
Ngươi muốn đăng ký, ngươi yêu cầu đưa ra thân phận của ngươi chứng cùng vé máy bay, thân phận chứng là vì chứng minh ngươi Trương Tam xác thật là ngươi Trương Tam, đây là authentication; mà vé máy bay là vì chứng minh ngươi Trương Tam xác thật mua phiếu có thể thượng phi cơ, đây là authorization.
Ở trang web chứng thực lĩnh vực lại cử cái ví dụ: Ngươi muốn đổ bộ diễn đàn, đưa vào username Trương Tam, mật mã 1234, mật mã chính xác, chứng minh ngươi Trương Tam xác thật là Trương Tam, đây là authentication; lại một check người dùng Trương Tam là cái bản chủ, cho nên có quyền hạn thêm tinh xóa người khác thiếp, đây là authorization.
6.2 springSecurity sử dụng
6.2.1 ỷ lại dẫn vào
<?xml version= "1.0" encoding= "UTF-8"?>
<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http:// w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.4</version>
<relativePath/><!-- lookup parent from repository -->
</parent>
<groupId>com.cn.wanxi</groupId>
<artifactId>springboot-security</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot-security</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
6.2.2 biên soạn phối trí văn kiện
spring:
datasource:
driver-class-name:com.mysql.cj.jdbc.Driver
username:root
password:root
url:jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false
security:
user:
name:lrs
password:***
mybatis:
mapperLocations:classpath:mapper/*.xml
configuration:
map-underscore-to-camel-case:true
Sử dụng security tự mang đăng nhập nghiệm chứng cửa sổ, thông tục nói chính là ngươi không cần chính mình ta liền đại lao, nơi này cũng có thể không xứng trí username mật mã, sẽ ở khống chế đài sinh thành chìa khóa bí mật
6.2.3 biên soạn thực hiện loại
Nên thật thể loại yêu cầu đi thực hiện GrantedAuthority tiếp lời hơn nữa trọng viết getAuthority() phương pháp, phương pháp này dùng choThu hoạch trao quyền
packagecom.cn.wanxi.springbootsecurity.entity;
importorg.springframework.security.core.GrantedAuthority;
importjava.awt.*;
importjava.util.Date;
/**
* @Author MrLiu
* @Date 2022/9/26 16:57
* @Version 1.0
*/
publicclassPermission2implementsGrantedAuthority{
privateIntegerid;
privateIntegerpid;
privateStringname;
privateStringvalue;
privateStringicon;
privateIntegertype;
privateStringuri;
privateIntegerstatus;
privateDatecreateTime;
privateStringsort;
@Override
publicStringgetAuthority(){
returnthis.value;
}
publicIntegergetId(){
returnid;
}
publicvoidsetId(Integerid){
this.id=id;
}
publicIntegergetPid(){
returnpid;
}
publicvoidsetPid(Integerpid){
this.pid=pid;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicStringgetValue(){
returnvalue;
}
publicvoidsetValue(Stringvalue){
this.value=value;
}
publicStringgetIcon(){
returnicon;
}
publicvoidsetIcon(Stringicon){
this.icon=icon;
}
publicIntegergetType(){
returntype;
}
publicvoidsetType(Integertype){
this.type=type;
}
publicStringgetUri(){
returnuri;
}
publicvoidsetUri(Stringuri){
this.uri=uri;
}
publicIntegergetStatus(){
returnstatus;
}
publicvoidsetStatus(Integerstatus){
this.status=status;
}
publicDategetCreateTime(){
returncreateTime;
}
publicvoidsetCreateTime(DatecreateTime){
this.createTime=createTime;
}
publicStringgetSort(){
returnsort;
}
publicvoidsetSort(Stringsort){
this.sort=sort;
}
}
Nên thật thể loại đối ứng người dùng biểu yêu cầu thực hiện UserDetails tiếp lời đều xem trọng viết getAuthorities() phương pháp dùng cho thu hoạch chứng thực sở hữu trao quyền
packagecom.cn.wanxi.springbootsecurity.entity;
importorg.springframework.security.core.GrantedAuthority;
importorg.springframework.security.core.userdetails.UserDetails;
importjava.util.Collection;
importjava.util.Date;
importjava.util.Set;
/**
* @Author MrLiu
* @Date 2022/9/26 16:52
* @Version 1.0
*/
publicclassWxUserEntityimplementsUserDetails{
privateIntegerid;
privateStringusername;
privateStringpassword;
privateStringicon;
privateStringemail;
privateStringnickName;
privateStringnote;
privateDatecreateTime;
privateDateloginTime;
privateIntegerstatus;
privateSet<?extendsGrantedAuthority>authorities;
@Override
publicCollection<?extendsGrantedAuthority>getAuthorities(){
returnthis.authorities;
}
publicvoidsetAuthorities(Set<?extendsGrantedAuthority>authorities){
this.authorities=authorities;
}
@Override
publicStringgetPassword(){
returnthis.password;
}
@Override
publicStringgetUsername(){
returnthis.username;
}
@Override
publicbooleanisAccountNonExpired(){
returntrue;
}
@Override
publicbooleanisAccountNonLocked(){
returntrue;
}
@Override
publicbooleanisCredentialsNonExpired(){
returntrue;
}
@Override
publicbooleanisEnabled(){
returntrue;
}
publicIntegergetId(){
returnid;
}
publicvoidsetId(Integerid){
this.id=id;
}
publicvoidsetUsername(Stringusername){
this.username=username;
}
publicvoidsetPassword(Stringpassword){
this.password=password;
}
publicStringgetIcon(){
returnicon;
}
publicvoidsetIcon(Stringicon){
this.icon=icon;
}
publicStringgetEmail(){
returnemail;
}
publicvoidsetEmail(Stringemail){
this.email=email;
}
publicStringgetNickName(){
returnnickName;
}
publicvoidsetNickName(StringnickName){
this.nickName=nickName;
}
publicStringgetNote(){
returnnote;
}
publicvoidsetNote(Stringnote){
this.note=note;
}
publicDategetCreateTime(){
returncreateTime;
}
publicvoidsetCreateTime(DatecreateTime){
this.createTime=createTime;
}
publicDategetLoginTime(){
returnloginTime;
}
publicvoidsetLoginTime(DateloginTime){
this.loginTime=loginTime;
}
publicIntegergetStatus(){
returnstatus;
}
publicvoidsetStatus(Integerstatus){
this.status=status;
}
@Override
publicStringtoString(){
return"WxUserEntity{"+
"id="+id+
",username='"+username+'\''+
",password='"+password+'\''+
",icon='"+icon+'\''+
",email='"+email+'\''+
",nickName='"+nickName+'\''+
",note='"+note+'\''+
",createTime="+createTime+
",loginTime="+loginTime+
",status="+status+
'}';
}
}
6.2.4 biên soạn kéo dài tầng
Hai cái phân biệt là tra người dùng cùng căn cứ người dùng id tra trao quyền biểu
@Mapper
publicinterfaceWxUserMapper{
List<WxUserEntity>getUserByName(Stringname);
List<Permission2>getPermissionByUserId(IntegeruserId);
}
<?xml version= "1.0" encoding= "UTF-8"?>
<!DOCTYPEmapperPUBLIC"-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mappernamespace="com.cn.wanxi.springbootsecurity.dao.WxUserMapper">
<selectid="getUserByName"resultType="com.cn.wanxi.springbootsecurity.entity.WxUserEntity">
select * from wx_user where username =#{name}
</select>
<selectid="getPermissionByUserId"resultType="com.cn.wanxi.springbootsecurity.entity.Permission2">
SELECT * FROM wx_permission as wxp INNER JOIN (SELECT permission_id from wx_role_permission_relation as rpr INNER JOIN wx_user_role_relation as urr where
rpr.role_id = urr.role_id and urr.admin_id = 3) as per on wxp.id = permission_id
</select>
</mapper>
6.2.5 nghiệp vụ logic tầng
Nên tiếp lời vì người dùng nghiệp vụ tiếp lời
packagecom.cn.wanxi.springbootsecurity.service;
/**
* @Author MrLiu
* @Date 2022/9/26 17:31
* @Version 1.0
*/
importcom.cn.wanxi.springbootsecurity.entity.Permission2;
importcom.cn.wanxi.springbootsecurity.entity.WxUserEntity;
importjava.util.List;
/**
* @author MrLiu
* @description: Nghiệp vụ tương quan Service, thực hiện chính mình nghiệp vụ logic xử lý.
*/
publicinterfaceWxUserService{
/**
* căn cứ username thu hoạch người dùng đối tượng
* @param name người dùng đăng nhập danh
* @return
*/
WxUserEntitygetUserByName(Stringname);
/**
* thu hoạch chỉ định người dùng có được quyền hạn
* @param userId người dùng id
* @return
*/
List<Permission2>getPermissionsByUserId(IntegeruserId);
}
Thực hiện tiếp lời
packagecom.cn.wanxi.springbootsecurity.service.Impl;
importcom.cn.wanxi.springbootsecurity.dao.WxUserMapper;
importcom.cn.wanxi.springbootsecurity.entity.Permission2;
importcom.cn.wanxi.springbootsecurity.entity.WxUserEntity;
importcom.cn.wanxi.springbootsecurity.service.WxUserService;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.stereotype.Service;
importorg.springframework.util.Assert;
importjava.util.List;
/**
* @Author MrLiu
* @Date 2022/9/26 17:32
* @Version 1.0
*/
@Service
publicclassWxUserServiceImplimplementsWxUserService{
@Autowired
WxUserMapperwxUserMapper;
@Override
publicWxUserEntitygetUserByName(Stringname){
List<WxUserEntity>list=wxUserMapper.getUserByName(name);
Assert.isTrue(list.size()==1,"Ngài đưa vào tài khoản không tồn tại, hoặc là có bao nhiêu cái tương đồng tài khoản");
returnlist.get(0);
}
@Override
publicList<Permission2>getPermissionsByUserId(IntegeruserId){
// thu hoạch quyền hạn
returnwxUserMapper.getPermissionByUserId(userId);
}
}
Trao quyền biểu nghiệp vụ logic, yêu cầu thực hiện UserDetailsService tiếp lời đều xem trọng viết loadUserByUsername(String username) phương pháp
packagecom.cn.wanxi.springbootsecurity.service;
importcom.cn.wanxi.springbootsecurity.entity.Permission2;
importcom.cn.wanxi.springbootsecurity.entity.WxUserEntity;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.security.core.userdetails.UserDetails;
importorg.springframework.security.core.userdetails.UserDetailsService;
importorg.springframework.security.core.userdetails.UsernameNotFoundException;
importorg.springframework.stereotype.Service;
importjava.util.HashSet;
importjava.util.List;
importjava.util.Set;
/**
* @Author MrLiu
* @Date 2022/9/26 18:14
* @Version 1.0
*/
@Service
publicclassMyUserDetailServiceimplementsUserDetailsService{
@Autowired
WxUserServicewxUserService;
@Override
publicUserDetailsloadUserByUsername(Stringusername)throwsUsernameNotFoundException{
WxUserEntitywxUserEntity=wxUserService.getUserByName(username);
List<Permission2>list=wxUserService.getPermissionsByUserId(wxUserEntity.getId());
HashSet<Permission2>set=newHashSet<>(list);
wxUserEntity.setAuthorities(set);
returnwxUserEntity;
}
}
6.2.6 khống chế tầng
packagecom.cn.wanxi.springbootsecurity.controller;
importcom.cn.wanxi.springbootsecurity.entity.WxUserEntity;
importorg.springframework.security.access.prepost.PreAuthorize;
importorg.springframework.security.core.context.SecurityContext;
importorg.springframework.security.core.context.SecurityContextHolder;
importorg.springframework.web.bind.annotation.RequestMapping;
importorg.springframework.web.bind.annotation.RestController;
importjavax.servlet.http.HttpSession;
/**
* @Author MrLiu
* @Date 2022/9/26 18:29
* @Version 1.0
*/
@RestController
@RequestMapping("/product")
publicclassProductController{
// nơi này phối trí nội dung là cơ sở dữ liệu, tỏ vẻ có cái này quyền hạn mới có thể sử dụng phương pháp này.
// cái này chú giải muốn tự định nghĩa Configure loại mở ra @EnableGlobalMethodSecurity mới có hiệu
@PreAuthorize("hasAuthority('wx:product:read')")
@RequestMapping("/phones")
publicStringgetPhones(HttpSessionhttpSession){
// SecurityContext securityContext = (SecurityContext) httpSession.getAttribute( "SPRING_SECURITY_CONTEXT" );
/*Spring Security sẽ đem SecurityContextHolder số liệu bảo tồn đến Session trung,
SecurityContextHolder tồn trữ chính là SecurityContext đối tượng
SecurityContext tồn trữ chính là Authentication đối tượng */
SecurityContextsecurityContext=SecurityContextHolder.getContext();
WxUserEntityuser=(WxUserEntity)securityContext.getAuthentication().getPrincipal();
Stringinfo=user+"";
returninfo;
}
}
6.2.7 phối trí loại
Nơi này chúng ta dùng chính mình đăng nhập phương thức
packagecom.cn.wanxi.springbootsecurity.config;
importcom.cn.wanxi.springbootsecurity.service.MyUserDetailService;
importcom.cn.wanxi.springbootsecurity.service.SimpleUserDetailsService;
importcom.cn.wanxi.springbootsecurity.service.WxUserService;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.context.annotation.Bean;
importorg.springframework.context.annotation.Configuration;
importorg.springframework.security.config.annotation.SecurityBuilder;
importorg.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
importorg.springframework.security.config.annotation.web.WebSecurityConfigurer;
importorg.springframework.security.config.annotation.web.builders.HttpSecurity;
importorg.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
importorg.springframework.security.core.userdetails.UserDetailsService;
importorg.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
importorg.springframework.security.crypto.password.PasswordEncoder;
/**
* @Author MrLiu
* @Date 2022/9/26 15:04
* @Version 1.0
*/
@Configuration
// cần thiết phải có, nếu không quyền hạn không có tác dụng
@EnableGlobalMethodSecurity(prePostEnabled=true)
publicclassWebSecurityConfigureextendsWebSecurityConfigurerAdapter{
@Autowired
privateMyUserDetailServicemyUserDetailService;
@Override
protectedvoidconfigure(HttpSecurityhttp)throwsException{
// bước đầu tiên, chúng ta thực hiện một cái đương phỏng vấn users tài nguyên khi không cần tiến hành nghiệm chứng.
http.authorizeRequests()
// cho đi
.antMatchers("/users").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.and()
//.userDetailsService(userDetailsService);
.userDetailsService(myUserDetailService);
}
// cái này phải có, dàn giáo phải đối mật mã làm mã hóa, không thể là văn bản rõ ràng.
@Bean
publicPasswordEncoderpasswordEncoder(){
returnnewBCryptPasswordEncoder();
}
}
🤳 bác chủ chủ trang:Copping0606😁
Bác chủ định kỳ đổi mới 🤦♂️
Cảm ơn ngươi như vậy đẹp còn chú ý ta 💖