Spring项目建立过程

news2024/11/18 11:21:47

1,导入依赖

导入Spring依赖

  <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
   </dependency>

2,实现部分


2.1 自动给我们请求返回一个登录页面,(基于过滤器实现的)

直接写一个的登录的流程

dao-xml文件-service-controller

 完成以上操作后访问:http://localhost:8080/hello 结果打开的是一个登录页面,其实这时候我们的请求已经被保护起来了,要想访问,需要先登录


2.2: 认证

从数据库获取用户信息,器替换默认的账号

1,继承 WebSecurityConfigurerAdapter 重写 configure(AuthenticationManagerBuilder auth),然后自定义一个service 类,必须继承一个类 UserDetailsService 达到自定义一用户名和密码功能

     

 

2,重写 configure(HttpSecurity http) 方法,达到自定义登录页面功能

第一种:不是前后端分离的项目:需要指定登录页面地址,和配置表单action 地址。

 

第二种:是前后端分离的项目,就不许指定登录页面地址,和配置表单action 地址。

(注意:一定是post请求),从前端进入

 


2.3:授权


1,通过 调用该 http.authorizeRequests() 就可以达到访问控制了

 

.anyRequest().authenticated(); 所有的请求都拦截

 

2,通过antMatchers() 给url 配置访问权限

权限控制方法主要是4个:

* hasRole() 
* hasAnyRole()
* hasAuthority()
* hasAnyAuthority()  

3,通过注解式配置权限访问控制

3.1:添加 @EnableGlobalMethodSecurity 注解(注意三套注解方式,默认都是关闭状态,使用哪一类就打开)

 

例如使用 securedEnabled 配置注解方式 @EnableGlobalMethodSecurity(securedEnabled = true)

 

3.2: 以后开发主要用的注解方式 @PreAuthorize()

3.3:在service中同时给认证授权的赋予权限或者角色

上面的是调用的账号和密码

下面括号中的是赋予角色或者权限 ,在controller中也如上图对应一样才能实现功能或者页面访问,否则就无权限访问


2.4:配置一些处理器


都是用于前后端分离的项目

1:配置登录成功方发处理器 ,实现 AuthenticationSuccessHandler 接口

package cn.woniu.handler;

import cn.woniu.util.JWTUtil;
import cn.woniu.util.ResponseResult;
import com.alibaba.fastjson.JSON;

import org.apache.catalina.filters.ExpiresFilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
import org.springframework.stereotype.Component;
import sun.text.normalizer.ICUBinary;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * 前后端分离的项目情况下,登录成功后,返回的不再是一个页面地址,,还是一个json
 * 处理用户登录成功后返回数据:比如用户等信息
 */
@Component
public class LoginSuccessHandler implements AuthenticationSuccessHandler {



    @Autowired
    private RedisTemplate<String, String> redisTemplate;


    @Override
    public void onAuthenticationSuccess(HttpServletRequest request,
                                        HttpServletResponse response,
                                        Authentication authentication)
            throws IOException, ServletException {

        /**
         * 获取登录成功的用户信息
         */
        User user = (User) authentication.getPrincipal();
        try {
            redisTemplate.opsForValue().set("jwt:"+user.getUsername(),
                    JWTUtil.createJWT(user.getUsername()));
        } catch (Exception e) {
            e.printStackTrace();
        }

        //设置字符串
        response.setContentType("application/json;charset=UTF-8");
        PrintWriter writer = response.getWriter();
        String json = JSON.toJSONString(ResponseResult.SECCUSS);
        writer.print(json);
        writer.flush();
        writer.close();
    }
}

2:配置登录失败方法处理器:实现 AuthenticationFailureHandler 接口

package cn.woniu.handler;

import cn.woniu.util.ResponseResult;
import com.alibaba.fastjson.JSON;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.authentication.AuthenticationFailureHandler;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * 登录失败后进入,返回给前端提示信息
 */
public class LoginFildHandler implements AuthenticationFailureHandler {
    @Override
    public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
        //设置字符串
        response.setContentType("application/json;charset=UTF-8");
        PrintWriter writer = response.getWriter();
        String json = JSON.toJSONString(ResponseResult.FAIL);
        writer.print(json);
        writer.flush();
        writer.close();
    }
}

3:配置用户未登录直接访问我们系统资源,实现 AuthenticationEntryPoint 接口

package cn.woniu.handler;

import cn.woniu.util.ResponseResult;
import com.alibaba.fastjson.JSON;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.AuthenticationEntryPoint;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * 前后端分离项目情况下,用户未登录直接访问系统资源会被拦截
 */
public class MyAuthenticationEntryPoint implements AuthenticationEntryPoint {


    @Override
    public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {
//设置字符串
        response.setContentType("application/json;charset=UTF-8");
        PrintWriter writer = response.getWriter();
        String json = JSON.toJSONString(ResponseResult.NOLOGIN);
        writer.print(json);
        writer.flush();
        writer.close();
    }
}

4:配置用户没有该资源访问权限情况下,实现 AccessDeniedHandler 接口

package cn.woniu.handler;

import cn.woniu.util.ResponseResult;
import com.alibaba.fastjson.JSON;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.web.access.AccessDeniedHandler;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * 虽然你知道用户名和密码
 * 但是,拦截你没有权限访问该资源操作
 *
 */
public class MyAccessDeniedHandler  implements AccessDeniedHandler {
    @Override
    public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException {
        //设置字符串
        response.setContentType("application/json;charset=UTF-8");
        PrintWriter writer = response.getWriter();
        String json = JSON.toJSONString(ResponseResult.NOAUTH);
        writer.print(json);
        writer.flush();
        writer.close();
    }
}

5:用户退出系统,实现LogoutSuccessHandler 接口

package cn.woniu.handler;

import cn.woniu.util.ResponseResult;
import com.alibaba.fastjson.JSON;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;


public class MyLogoutSuccessHandler implements LogoutSuccessHandler{

    @Override
    public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
        //设置字符串
        response.setContentType("application/json;charset=UTF-8");
        PrintWriter writer = response.getWriter();
        String json = JSON.toJSONString(ResponseResult.LOGOUT);
        writer.print(json);
        writer.flush();
        writer.close();
    }
}

JWT


导入依赖

<dependency>
    <groupId>com.nimbusds</groupId>
    <artifactId>nimbus-jose-jwt</artifactId>
    <version>9.11.1</version>
</dependency>

JWT 就是一个经过加密得到一个字符串,有三个部分组成,分别是:头部(放一些关于jwt本身相关的信息),载荷:(放用户登录成功后的信息,主要:不要放敏感信息),签名:(有头部加上载荷,经过密钥加密得到的一个字符串)

3.1,代码得到JWT


头部代码

 JWSHeader jwsHeader =new JWSHeader.
                Builder(JWSAlgorithm.HS256).
                type(JOSEObjectType.JWT).build();

载荷代码  

 //创建载荷
        Map map = new HashMap<>();
        map.put("username",username);
        Payload payload = new Payload(map);

签名代码

 JWSSigner jwsSigner = new MACSigner(KEY);
 JWSObject jwsObject = new JWSObject(jwsHeader,payload);
 jwsObject.sign(jwsSigner);

解密前后传过来的jwt

 JWSObject parse = JWSObject.parse(jwt);
 JWSVerifier jwsVerifier = new MACVerifier(KEY);
 return  parse.verify(jwsVerifier);

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/77773.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【计算机网络】物理层

物理层考虑的是在各种传输媒体上传输比特流&#xff0c;而不是指具体的传输媒体。物理层作用是尽可能地屏蔽媒体之间的差异。 物理层的主要任务是描述与传输媒体有关的一些特性&#xff1a; 机械特性、电气特性、功能特性、过程特性。 数据通信系统可分为&#xff1a;源系统、…

攻击类型分析

攻击类型分析 2018 年&#xff0c;主要的攻击类型 1 为 SYN Flood&#xff0c;UDP Flood&#xff0c;ACK Flood&#xff0c;HTTP Flood&#xff0c;HTTPS Flood&#xff0c; 这五大类攻击占了总攻击次数的 96&#xff05;&#xff0c;反射类攻击不足 3%。和 2017 年相比&…

Vue系列之组件化

文章の目录一、组件化开发思想1、现实中的组件化思想体现2、编程中的组件化思想体现3、组件化规范: Web Components二、组件注册1、全局组件注册语法2、组件语法3、组件注册注意事项4、局部组件注册写在最后一、组件化开发思想 1、现实中的组件化思想体现 标准分治重用组合 2…

k8s网络策略

网络策略介绍 网络策略官方文档&#xff1a;https://kubernetes.io/zh-cn/docs/concepts/services-networking/network-policies/ 网络策略是控制Pod之间如何进行通信的规则&#xff0c;它使用标签来筛选Pod&#xff0c;并在该组Pod之上定义规则来定义管控其流量&#xff0c;…

何为Spring Batch?怎么玩?

何为批处理&#xff1f; 何为批处理&#xff0c;大白话讲就是将数据分批次进行处理的过程。比如&#xff1a;银行对账&#xff0c;跨系统数据同步等。这些处理逻辑一般来说都不需要人工参与就能够自动高效地进行复杂的数据处理与分析。 典型批处理特点&#xff1a; 自动执行&…

ubuntu下使用vscode开发golang程序,从控制台到简单web程序

最近项目要使用go语言开发一个web程序&#xff0c;由于是第一次使用go开发&#xff0c;就将开发过程中的点滴做个记录吧。 1.安装go 1.1 安装 Ubuntu下安装go语言开发运行环境有如下两种方法 &#xff08;1&#xff09;方法一&#xff1a;使用命令 sudo apt install golan…

天天刷 B站,了解他们的评论系统是如何设计的吗?

今天给大家分享 B站的评论系统的 组件化、平台化建设 通过持续演进架构设计&#xff0c;管理不断上升的系统复杂度&#xff0c;从而更好地满足各类用户的需求。 基础功能模块 评论的基础功能模块是相对稳定的。 1. 发布评论&#xff1a;支持无限盖楼回复。 2. 读取评论&am…

异步编程解决方案 Promise

1. 回调地狱 2. Promise 的使用 3. Promise 的状态 4. Promise 的结果 5. Promise 的 then 方法 6. Promise 的 catch 方法 7. 回调地狱的解决方案 1. 回调地狱 回调地狱: 在回调函数中嵌套回调函数 因为 ajax 请求是异步的&#xff0c;所以想要使用上一次请求的结果作为请求…

ADI Blackfin DSP处理器-BF533的开发详解21:RTC实时时钟的原理及应用(含源码)

硬件准备 ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 功能介绍 ADSP-BF53x 处理器上集成了一个实时时钟&#xff08;RTC&#xff09;模块&#xff0c;板卡上设计了一个专门用于 RTC 时钟源的晶体32.7…

如何修复错误:无法下载 metadata repo appstream

如何修复错误&#xff1a;无法下载 metadata repo appstream 如果您出于某种原因仍在积极使用CentOS 8&#xff0c;您可能在尝试更新系统或只是安装软件包时遇到以下错误。 Error: Failed to download metadata for repo appstream: Cannot prepare internal mirrorlist: No …

Linux内存管理

平时我们说计算机的“计算”两个字&#xff0c;其实说的就是两方面&#xff0c;第一&#xff0c;进程和线程对于CPU的使用&#xff1b;第二&#xff0c;对于内存的管理。——这个是对计算机的理解的两个大方面&#xff0c;面试中问到的场景设计题可以尝试从这两个角度出发。 可…

Gradle学习笔记之项目生命周期及settings文件

文章目录Gradle项目的生命周期settings文件Gradle项目的生命周期 Gradle项目的生命周期分为初始化->配置->执行三步&#xff0c;如下图所示&#xff1a; 初始化阶段主要目的是初始化构建&#xff0c;分为执行初始化脚本和执行设置脚本两步&#xff0c;前者在每个项目构…

多线程的实现

目录 进程和线程 并发和并行 继承实现Runnable接口的Thread类实现的多线程 实现Runnable接口创建线程类 线程常用方法 进程和线程 进程&#xff1a;一个程序的启动就可以抽象化为一个进程 线程&#xff1a;线程是由进程开启的&#xff0c;一个进程可以创建多个线程&#x…

环形队列、 条带环形队列 Striped-RingBuffer (史上最全)

文章很长&#xff0c;而且持续更新&#xff0c;建议收藏起来&#xff0c;慢慢读&#xff01;疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 &#xff1a; 免费赠送 :《尼恩Java面试宝典》 持续更新 史上最全 面试必备 2000页 面试必备 大厂必备 涨薪必备 免费赠送 经典…

基于jsp+mysql+ssm项目bug修复管理系统-计算机毕业设计

项目介绍 本文主要是采用ssm的mvc技术、Mysql数据库、Tomcat服务器作为开发平台&#xff0c;系统采用B/S结构进行开发&#xff0c;完成一个项目修复管理系统&#xff0c;构建企业管理与员工任务计划相结合。提供了包括传统业务中最基本的用户注册、登录、查询、职位信息、部 门…

MicroPython-On-ESP8266——8x8LED点阵模块(3)使用MAX7219驱动

MicroPython-On-ESP8266——8x8LED点阵模块&#xff08;3&#xff09;使用MAX7219驱动 1. 新主角登场 手上有块8x8LED点阵屏&#xff0c;咱们已经了解了点阵屏的基础电路与驱动原理&#xff0c;并用两片74HC595锁存IC成功驱动点阵屏显示需要的图案。 MicroPython-On-ESP8266…

DBCO-PEG-CHO,DBCO-CHO,二苯基环辛炔-聚乙二醇-醛基

一、理论分析&#xff1a; 中文名&#xff1a;二苯基环辛炔-聚乙二醇-胆固醇&#xff0c;胆固醇偶联二苯基环辛炔&#xff0c; 二苯基环辛炔-聚乙二醇-醛基&#xff0c;点击试剂DBCO偶联醛基 英文名&#xff1a;DBCO-PEG-CHO&#xff1b; DBCO-CHO 二、结构式&#xff1a; 三…

【JavaEE】B/S结构系统的会话机制_session机制

session机制什么是会话&#xff1f;session机制为什么需要session对象来保存会话状态呢&#xff1f;只要B和S断开了&#xff0c;那么关闭浏览器这个动作&#xff0c;服务器知道吗&#xff1f;为什么不使用request(ServletRequest)对象保存会话状态&#xff1f;为什么不使用appl…

【c++实战项目】——云备份服务器

项目介绍 云备份服务器能够通过浏览器将文件上传到服务器上。并且随时可以通过浏览器进行查看并且下载&#xff0c;其中下载的过程支持断点续传。服务器上有热点管理模块&#xff0c;将非热点文件进行压缩存储&#xff0c;节省服务器的磁盘空间。服务器各个模块的功能介绍 配…

Python入门学习需要知道的100个小技巧,加了几个小时班终于整理出来了

Python新手需要知道的100个小技巧序言最后序言 哈喽兄弟们&#xff0c;今天给大家分享一下Python初学需要知道的100个小技巧~ 1、for循环中的else条件 这是一个for-else方法&#xff0c;循环遍历列表时使用else语句。下面举个例子&#xff0c;比如我们想检查一个列表中是否包…