Security--02(处理不同请求的类型)

1.功能图

之前我们的请求是直接会跳到一个请求登录页面的Controller,然后跳到登录页面,现在我们的需求是判断一下请求的类型,然后跳转到自己的Controller.,然后处理返回不同的信息。

现将之前的一些在demo-lilly里面的配置沉淀到borwser包里面,但是在打包的时候报找不到Filter,z所以在依赖中加上

要实现这样的一个功能需要跳转前判断这个请求的类型,这里需要HttpSessionRequestCache这个类拿到当前缓存的请求,

接到Html请求以后是否需要身份认证的这个判断是Security做的,如果需要身份认证,他会做一个跳转,根据你loginPage的配置来决定你跳到哪里,但是在执行这个跳转之前,Spring Security用HttpSessionRequestCache把当前的请求缓存到这个类里面,所以我们可以根据这个类来拿当前请求的类型。

判断之后利用这个类RedirectStrategy做跳转,至于跳转的请求需要从配置中拿。

下面介绍如何封装系统配置

2.系统配置封装

 系统配置类我们写到core包里面,

 springboot 访问template资源必须经过控制器,如果想不经过控制器直接跳转,需要将资源放到静态文件夹下。但是thymeleaf放到静态资源文件下有一个问题,就是页面会出现中文乱码,由于是静态资源所以无法通过视图解析器的配置去改变这一问题,就算解决了,thymeleaf的标签在静态资源下回全部失效,所以这种办法不可取,我们需要采取第二种解决方式

 

 首选先demo项目的自定义登录配置页面

  

封装系统配置的第一个类

封装系统配置的第二个类:

资源文件在:

使系统配置起作用:

注入即可使用:

需要注意的是需要加上Controller转换到视图,这个配置不能在starter包里面去做转换,因为用户可能需要在自定义页面上显示一些问题

3.登录成功处理

   默认情况下security登录成功后会把请求转到引发操作的请求上,那么什么时候需要自定义登录成功的处理,比如说前端登录后仅仅只想拿到用户的信息去做处理,这个时候就需要自定义登录成功的处理流程。

  自定义登录成功处理需要实现一个接口

  

  

 然后加上这样一个配置:

 

  

4.登录失败处理

  实现AuthenticationFailureHandler接口

 

   

 

但是我们的目标是要做一个可重用的认证模块,也就是说要包含返回json,和跳转登录的这两种情况。

5.认证完成返回JSON或跳转

  实现的思路:首先security的默认的认证成功的处理类是SavedRequestAwareAuthenticationSuccessHandler,他一样是实现了AuthenticationSuccessHandler接口,我们只需要继承这个默认的,再判断一下类型,实现自己的就行了。

   两种类型:

  

  默认JSON处理

package org.lilly.browser.authentication;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.lilly.core.properties.LoginType;
import org.lilly.core.properties.SecurityProperties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;
import org.springframework.stereotype.Component;

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

/**
 * User: Mr.Wang
 * Date: 2020/6/8
 */
@Component
public class LillyAuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler {
    private Logger logger = LoggerFactory.getLogger(getClass());

    @Autowired
    private ObjectMapper objectMapper;
    @Autowired
    private SecurityProperties securityProperties;

    @Override
    public void onAuthenticationSuccess(HttpServletRequest httpServletRequest,
                                        HttpServletResponse httpServletResponse,
                                        Authentication authentication) throws IOException,
            ServletException {
        logger.info("登录成功");
        if (LoginType.JSON.equals(securityProperties.getBrowser().getLoginType())) {
            httpServletResponse.setContentType("application/json;charset=UTF-8");
            httpServletResponse.getWriter().write(objectMapper.writeValueAsString(authentication));
        } else {
            super.onAuthenticationSuccess(httpServletRequest, httpServletResponse, authentication);
        }
    }
}

 demo项目配置:

 

测试:

首先我配置登录的类型为JSON类型或者不配置,访问hello.html,会返回JSON

当我们配置登录的类型后,访问http://localhost:8080/preLogin.html

当然需要一个控制器来处理这个登录的请求,登录后会自动跳转到登录前的页面

 

 

常见问题:

重定向次数太多,是因为自定义请求的登录页面没有去security放权

配置类无法注入使用,是因为demo项目的包没有扫描到

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Content-Security-Policy (CSP) 是一种HTTP头部字段,用于帮助Web应用增强安全性,控制网页内容如何加载和执行。CSP允许开发者定义一系列规则,限制浏览器加载资源的来源、类型以及执行的脚本和样式等行为。这有助于防止跨站脚本攻击(XSS)、恶意代码注入、数据泄露等问题。 设置CSP主要包括以下几个关键点: 1. **基本策略**: 使用`content-security-policy`头部字段声明,例如: ``` Content-Security-Policy: default-src 'self'; ``` 这表示只允许从当前源加载内容。 2. **源策略**: `default-src`可以指定一组或单独的源,如: ``` default-src 'self' https: data:; ``` 这里指定了除了'self'之外还允许https和data:协议的资源加载。 3. **资源类型**: 可以使用`script-src`, `style-src`, `img-src`, `frame-src`等指令分别控制不同类型的资源加载来源。 4. **允许特定资源**: `connect-src`控制连接请求(如WebSocket),`font-src`控制字体资源,`media-src`控制媒体资源等。 5. **执行策略**: `script-src-elem`和`script-nonce`用于处理内联脚本,`child-src`管理嵌套框架。 6. **报告策略**: `report-uri`指定当违反策略时发送报告的URL,以便开发者收集安全事件信息。 7. **沙箱模式**: 使用`sandbox`属性或`sandbox`-related directives如`allow-scripts`、`allow-top-navigation`等进一步限制页面行为。 为了确保CSP的有效性,需要在服务器端配置并始终发送这个头部信息给客户端。同时,开发人员也需要遵循CSP策略来编写代码,避免潜在的安全风险。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时空恋旅人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值