XML、HTML注入和越权问题处理

这篇具有很好参考价值的文章主要介绍了XML、HTML注入和越权问题处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、XSS和HTMl注入

原理:使用一些script脚本和html标签注入进系统,然后进行侵入。

例如:

<img  onerror="alert(1)" src="aaa" />
<p><img src=1 onerror=alert("xss") /></p>
<p><a href="http://www.baidu.com:">aaa</a></p>

处理方式:

1、进行转义,可以使用阿帕奇包里的StringEscapeUtils.escapeHtml方法进行字符串转义。

 s= StringEscapeUtils.escapeHtml4(s)

2、通过字符串替换进行过滤,替换里面的一些事件标签或者一些脚本标签。

	s = Pattern.compile("onload(.*?)=", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
	cleanValue = s.matcher(cleanValue).replaceAll("");

	s = Pattern.compile("onerror(.*?)=", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
	cleanValue = s.matcher(cleanValue).replaceAll("");

3、可以使用Antisamy工具进行统一的数据清洗,不过需要添加一些配置。使用的是antisamy-ebay.xml文件。需要将其放到

Spring mvc版本:

pom文件:排除slf4j是因为对项目产生了jar包冲突,若未产生则不需要排除。

<antisamy.version>1.6.2</antisamy.version> 
<!-- https://mvnrepository.com/artifact/org.owasp.antisamy/antisamy -->
<dependency>
    <groupId>org.owasp.antisamy</groupId>
    <artifactId>antisamy</artifactId>
    <version>${antisamy.version}</version>
    <exclusions>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
        </exclusion>
    </exclusions>
</dependency>

XssFilter.java

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

/**
 *
 *Xss过滤器
 *
 */
public class XssFilter implements  Filter{
    /**
     * 换行标识
     */
    public static final  String line_flag = "[~line_flag~]";
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // 拦截请求,处理XSS过滤
        chain.doFilter(new XSSHttpServletRequestWrapper((HttpServletRequest) request), response);
    }

    @Override
    public void destroy() {
    }
}

XSSHttpServletRequestWrapper.java:getInputStream() 重写此方法是为了获取post提交的json数据–@RequestBody

import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.StrUtil;
import org.apache.commons.lang3.StringEscapeUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;

import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Vector;


public class XSSHttpServletRequestWrapper extends HttpServletRequestWrapper {
    public XSSHttpServletRequestWrapper(HttpServletRequest request) {
        super(request);
    }

    /**
     * 方法说明:过滤掉字符
     *
     * @param name
     * @return
     */
    @Override
    public String getParameter(String name) {
        String value = super.getParameter(name);
        return htmlFilter(value);
    }

    /**
     * 方法说明:过滤掉字符
     *
     * @param name
     * @return
     */
    @Override
    public String getHeader(String name) {
        return htmlFilter(super.getHeader(name));
    }

    /**
     * 方法说明:过滤掉字符
     *
     * @param name
     * @return
     */
    @Override
    public String[] getParameterValues(String name) {
        String[] values = super.getParameterValues(name);
        if (values == null || values.length == 0) {
            return values;
        }
        for (int i = 0; i < values.length; i++) {
            values[i] = htmlFilter(values[i]);
        }
        return values;
    }

    @Override
    @SuppressWarnings("unchecked")
    public Enumeration<String> getParameterNames(){
        Enumeration<String> e = super.getParameterNames();
        Vector<String> v = new Vector<String>();
        while (e.hasMoreElements()) {
            String paramName = e.nextElement();
            if(StringUtils.isBlank(paramName)){
                paramName = "";
            }
            paramName = htmlFilter(paramName);
            v.add(paramName);
        }
        return v.elements();
    }

    /**
     * 方法说明:过滤掉字符,struts2获取request参数就是通过该方法,所以以后要注意
     *
     * @return Map
     */
    @Override
    @SuppressWarnings("unchecked")
    public Map<String, String[]> getParameterMap() {
        Map<String, String[]> returnMap = new HashMap<String, String[]>();
        Enumeration<String> e = super.getParameterNames();
        while (e.hasMoreElements()) {
            String paramName = e.nextElement();
            String[] values = getParameterValues(paramName);
            if (StringUtils.isNotBlank(paramName)) {
                returnMap.put(paramName, values);
            }
        }
        return returnMap;
    }
    @Override
    public ServletInputStream getInputStream() throws IOException {
        // 非json类型,直接返回
        if (!super.getHeader(HttpHeaders.CONTENT_TYPE).equalsIgnoreCase(MediaType.APPLICATION_JSON_VALUE)) {
            return super.getInputStream();
        }
        String json = IoUtil.read(super.getInputStream(), "utf-8");
        if (StrUtil.isEmpty(json)) {
            return super.getInputStream();
        }
        //转义
        json = StringEscapeUtils.unescapeHtml4(json);
        // 这里要注意,json格式的参数不能直接使用hutool的EscapeUtil.escape, 因为它会把"也给转义,
        // 使得@RequestBody没办法解析成为一个正常的对象,所以我们自己实现一个过滤方法
        // 或者采用定制自己的objectMapper处理json出入参的转义(推荐使用)
        json =htmlFilter(json).trim();
        final ByteArrayInputStream bis = new ByteArrayInputStream(json.getBytes(StandardCharsets.UTF_8));
        return new ServletInputStream() {
            @Override
            public boolean isFinished() {
                return true;
            }

            @Override
            public boolean isReady() {
                return true;
            }

            @Override
            public void setReadListener(ReadListener readListener) {
            }

            @Override
            public int read() {
                return bis.read();
            }
        };

    }


    private String htmlFilter(String s) {
        if (s == null) {
            return s;
        }

        final String line_flag = XssFilter.line_flag;
        // 换行特殊字符替换先,在AntiSamy 处理时,会将换行符处理成空格,所以在AntiSamy处理后将特殊字符替换成换行符;
        s = s.replace("\r\n", line_flag).replace("\r", line_flag).replace("\n", line_flag);
        s = HtmlFilterConfig.htmlFiler(s);
        s = s.replace(line_flag, "\n");
        return StringEscapeUtils.unescapeHtml4(s);
    }
}

public class HtmlFilterConfig {
	private static final Logger logger = LoggerFactory.getLogger(HtmlFilterConfig.class);
	private static HtmlFilter htmlFilter = null;


	public static String htmlFiler(String html) {
		if (htmlFilter == null) {
			return html;
		}
		return htmlFilter.htmlFiler(html);
	}

	/**
	 * 初始化
	 * @param htmlFilterClass
	 * @param initParam
	 */
	public static void init(String htmlFilterClass, String initParam) {
		try {
			if (htmlFilterClass != null && htmlFilterClass.length() > 0) {
				htmlFilter = (HtmlFilter) Class.forName(htmlFilterClass)
						.newInstance();

			}
			htmlFilter.init(initParam);
		} catch (InstantiationException e) {
			if (logger.isErrorEnabled()) {
				logger.error("HtmlFilter use user-defined filter:" + htmlFilterClass
								+ " instantiation error", e);
			}
		} catch (IllegalAccessException e) {
			if (logger.isErrorEnabled()) {
				logger.error("HtmlFilter use user-defined filter:" + htmlFilterClass
								+ " illegalAccess error", e);
			}
		} catch (ClassNotFoundException e) {
			if (logger.isErrorEnabled()) {
				logger.error("HtmlFilter use user-defined filter:" + htmlFilterClass
								+ " not found", e);
			}
		}
	}
}

Spring Boot版本:

AntiSamyConfig.java

@Configuration
public class AntiSamyConfig {
    /**
     * * 配置XSS过滤器
     *
     * @return FilterRegistrationBean
     */
    @Bean
    public FilterRegistrationBean<Filter> filterRegistrationBean() {
        FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean<>(new XssFilter());
        filterRegistrationBean.addUrlPatterns("/*");
        filterRegistrationBean.setOrder(1);
        return filterRegistrationBean;
    }
    /**
     * 用于过滤Json类型数据的解析器
     *
     * @param builder Jackson2ObjectMapperBuilder
     * @return ObjectMapper
     */
    @Bean
    @Primary
    public ObjectMapper xssObjectMapper(Jackson2ObjectMapperBuilder builder) {
        // 创建解析器
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
        // 注册解析器
        SimpleModule simpleModule = new SimpleModule("XssStringJsonSerializer");
        //入参和出参过滤选一个就好了,没必要两个都加
        //这里为了和XssHttpServletRequestWrapper统一,建议对入参进行处理
        //注册入参转义
        simpleModule.addDeserializer(String.class, new XssRequestWrapper.XssStringJsonDeserializer());
        //注册出参转义
//        simpleModule.addSerializer(new XssRequestWrapper.XssStringJsonSerializer());
        objectMapper.registerModule(simpleModule);
        return objectMapper;
    }
}

XssFilter.java

public class XssFilter implements Filter {
    /**
     * 换行标识
     */
    public static final  String LINE_BREAK_FLAG = "[~line_brk_fg~]";
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // 拦截请求,处理XSS过滤
        chain.doFilter(new XssRequestWrapper((HttpServletRequest) request), response);
    }

    @Override
    public void destroy() {
    }
}

XssRequestWrapper.java

@Slf4j
public class XssRequestWrapper extends HttpServletRequestWrapper {
    private static Policy policy = null;
    // html过滤
    static {
        try {
            // 获取策略文件路径,策略文件需要放到项目的classpath下
            String antiSamyPath = Objects
                    .requireNonNull(XssRequestWrapper.class.getClassLoader().getResource("antisamy-ebay.xml")).getFile();
            log.info("XssRequestWrapper::antiSamyPath 路径:{}", antiSamyPath);
            // 获取的文件路径中有空格时,空格会被替换为%20,在new一个File对象时会出现找不到路径的错误
            // 对路径进行解码以解决该问题
            antiSamyPath = URLDecoder.decode(antiSamyPath, "utf-8");
            log.info("XssRequestWrapper::antiSamyPath 路径:{}", antiSamyPath);
            // 指定策略文件
            policy = Policy.getInstance(antiSamyPath);
        } catch (UnsupportedEncodingException | PolicyException e) {
            log.error("XssRequestWrapper  failure.", e);
        }
    }

    public XssRequestWrapper(HttpServletRequest request) {
        super(request);
    }

    /**
     * 过滤请求头
     *
     * @param name 参数名
     * @return 参数值
     */
    @Override
    public String getHeader(String name) {
        String header = super.getHeader(name);
        // 如果Header为空,则直接返回,否则进行清洗
        return StringUtils.isBlank(header) ? header : xssClean(header);
    }

    @Override
    public String getParameter(String name) {
        String parameter = super.getParameter(name);
        // 如果Parameter为空,则直接返回,否则进行清洗
        return StringUtils.isBlank(parameter) ? parameter : xssClean(parameter);
    }

    @Override
    public Map<String, String[]> getParameterMap() {
        Map<String, String[]> requestMap = super.getParameterMap();
        requestMap.forEach((key, value) -> {
            for (int i = 0; i < value.length; i++) {
                log.info(value[i]);
                value[i] = xssClean(value[i]);
                log.info(value[i]);
            }
        });
        return requestMap;
    }

    @Override
    public ServletInputStream getInputStream() throws IOException {
        // 非json类型,直接返回
        if (!super.getHeader(HttpHeaders.CONTENT_TYPE).equalsIgnoreCase(MediaType.APPLICATION_JSON_VALUE)&&!super.getHeader(HttpHeaders.CONTENT_TYPE).equalsIgnoreCase(MediaType.APPLICATION_JSON_UTF8_VALUE)) {
            return super.getInputStream();
        }
        String json = IoUtil.read(super.getInputStream(), "utf-8");
        if (StrUtil.isEmpty(json)) {
            return super.getInputStream();
        }
        json = StringEscapeUtils.unescapeHtml4(json);
        // 这里要注意,json格式的参数不能直接使用hutool的EscapeUtil.escape, 因为它会把"也给转义,
        // 使得@RequestBody没办法解析成为一个正常的对象,所以我们自己实现一个过滤方法
        // 或者采用定制自己的objectMapper处理json出入参的转义(推荐使用)
        json =xssClean(json).trim();
        final ByteArrayInputStream bis = new ByteArrayInputStream(json.getBytes(StandardCharsets.UTF_8));
        return new ServletInputStream() {
            @Override
            public boolean isFinished() {
                return true;
            }

            @Override
            public boolean isReady() {
                return true;
            }

            @Override
            public void setReadListener(ReadListener readListener) {
            }

            @Override
            public int read() {
                return bis.read();
            }
        };

    }
   
    @Override
    public String[] getParameterValues(String name) {
        String[] parameterValues = super.getParameterValues(name);
        if (parameterValues != null) {
            int length = parameterValues.length;
            String[] newParameterValues = new String[length];
            for (int i = 0; i < length; i++) {
                // 清洗参数
                newParameterValues[i] = xssClean(parameterValues[i]);
            }
            return newParameterValues;
        }
        return super.getParameterValues(name);
    }

    /**
     * 使用AntiSamy清洗数据
     *
     * @param value 需要清洗的数据
     * @return 清洗后的数据
     */
    private String xssClean(String value) {
        try {
            final String LINE_BREAK_FLAG = XssFilter.LINE_BREAK_FLAG;
            // 换行特殊字符替换先,在AntiSamy 处理时,会将换行符处理成空格,所以在AntiSamy处理后将特殊字符替换成换行符;
            value = value.replace("\r\n", LINE_BREAK_FLAG).replace("\r", LINE_BREAK_FLAG).replace("\n", LINE_BREAK_FLAG);
            value = value.replace("/::<", "/::&lt;");
            AntiSamy antiSamy = new AntiSamy();
            // 使用AntiSamy清洗数据
            final CleanResults cleanResults = antiSamy.scan(value, policy);
            // 获得安全的HTML输出
            value = cleanResults.getCleanHTML();
            // 替换 双引号""
            value =  value.replaceAll("\"","'");
            value = value.replace("/::<", "/::&lt;");
            value = value.replace(LINE_BREAK_FLAG, "\n");
            // 对转义的HTML特殊字符(<、>、"等)进行反转义,因为AntiSamy调用scan方法时会将特殊字符转义
            return StringEscapeUtils.unescapeHtml4(value);
        } catch (ScanException | PolicyException e) {
            e.printStackTrace();
        }
        return value;
    }

    /**
     * 通过修改Json序列化的方式来完成Json格式的XSS过滤
     */
    public static class XssStringJsonSerializer extends JsonSerializer<String> {

        @Override
        public Class<String> handledType() {
            return String.class;
        }

        @Override
        public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
            if (!StringUtils.isBlank(value)) {
                try {
                    AntiSamy antiSamy = new AntiSamy();
                    final CleanResults cleanResults = antiSamy.scan(value, XssRequestWrapper.policy);
                    gen.writeString(StringEscapeUtils.unescapeHtml4(cleanResults.getCleanHTML()));
                } catch (PolicyException | ScanException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 处理json入参的转义
     */
    public static class XssStringJsonDeserializer extends JsonDeserializer<String> {

        @Override
        public Class<String> handledType() {
            return String.class;
        }

        //对入参转义
        @Override
        public String deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
            String value = jsonParser.getValueAsString();
            if (value != null) {
                return EscapeUtil.escape(value.toString());
            }
            return value;
        }

    }
}

2、越权问题

原理:越权主要分为垂直越权和水平越权,垂直越权是指当一个普通用户使用管理员的信息能够获取到不属于自己权限内的信息。水平越权是指都是普通用户,但是不同部门不同组,却可以通过接口获取其他人的信息。

处理:我们此次主要采用的是引入Security 框架,通过@PreAuthorize注解和自定义权限认证方法去进行接口管控(此方法主要用于水平越权)。

相关代码:

登录信息放入Security:
UserDetails userDetails = new OperatorUserDetails(user, Arrays.asList(user.getPrivilege());
				UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
				authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
				SecurityContextHolder.getContext().setAuthentication(authentication);

@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)

这两个注解很重要!!!

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {



    @Override
    public void configure(HttpSecurity httpSecurity) throws Exception {
        ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry registry = httpSecurity
                .authorizeRequests();
        //url为白名单地址
         registry.antMatchers(url).permitAll();
       

       //允许跨域请求的OPTIONS请求
        registry.antMatchers(HttpMethod.OPTIONS)
                .permitAll();
        registry.anyRequest().authenticated()
                // 自定义权限拒绝处理类
                .and()
                .csrf()
                .disable()
                .exceptionHandling()
                .accessDeniedHandler(restfulAccessDeniedHandler())
                .authenticationEntryPoint(restAuthenticationEntryPoint())
                .and()
                .headers()
                .frameOptions()
                .disable()
                .and()
                .addFilterBefore(securityOncePerRequestFilter(), UsernamePasswordAuthenticationFilter.class);



    }

    /**
     * Override this method to configure {@link WebSecurity}. For example, if you wish to
     * ignore certain requests.
     *
     * @param web
     */
    @Override
    public void configure(WebSecurity web) throws Exception {
        super.configure(web);
        web.httpFirewall(defaultHttpFireWall());
    }

    @Bean
    public RestfulAccessDeniedHandler restfulAccessDeniedHandler() {
        return new RestfulAccessDeniedHandler();
    }

    @Bean
    public RestAuthenticationEntryPoint restAuthenticationEntryPoint() {
        return new RestAuthenticationEntryPoint();
    }


    @Bean
    public SecurityOncePerRequestFilter securityOncePerRequestFilter() {
        return new SecurityOncePerRequestFilter();
    }


    @Bean
    public HttpFirewall defaultHttpFireWall() {
        return new DefaultHttpFirewall();
    }

}

RestfulAccessDeniedHandler.java

public class RestfulAccessDeniedHandler implements AccessDeniedHandler{
    @Override
    public void handle(HttpServletRequest request,
                       HttpServletResponse response,
                       AccessDeniedException e) throws IOException, ServletException {
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Cache-Control","no-cache");
        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/json");
        response.getWriter().println("您没有权限"));
        response.getWriter().flush();
    }
}

RestAuthenticationEntryPoint.java

public class RestAuthenticationEntryPoint implements AuthenticationEntryPoint {
    @Override
    public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Cache-Control","no-cache");
        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/json");
        response.getWriter().println("您暂未登录");
        response.getWriter().flush();
    }
}

使用方法:在接口层次上加 @PreAuthorize(“@pms.hasPermission(‘自定义的权限值’)”)

/**
 * @Description  检查客服权限
 */
@Component("pms")
public class PermissionService {

    

        /**
     * 检查权限
     * @param permissions
     * @return
     */
    public boolean hasPermission(String ...permissions){
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        Object principal = authentication.getPrincipal();
        if ("anonymousUser".equals(principal)){
            return false;
        }
        OperatorUserDetails userDetails = (OperatorUserDetails) principal;
        User user = userDetails.getUser();
        for (String permission : permissions) {
            if (user.getPrivilege().hasPrivilege(permission)){
                return true;
            }
        }
        
        return false;
    }
}

SecurityWebApplicationInitializer.java 必须存在,不然会出现篡权问题

public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer {
//public class SecurityWebApplicationInitializer {

}

需要导入此配置。

@Import({ SecurityConfig.class})

注意:如果接口没有权限,默认是会返回500,所以为了进一步区分,所以建议拦截@ExceptionHandler(AccessDeniedException.class)和@ExceptionHandler(AuthenticationException.class)这两个异常。文章来源地址https://www.toymoban.com/news/detail-730604.html

到了这里,关于XML、HTML注入和越权问题处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring boot项目java bean和xml互转

    工作中需要给下游第三方收费系统做数据挡板,由于下游系统使用的是 soap webservice ,里面涉及各种xml跟bean的互转,在此介绍一下使用的方法。 基于springboot搭建webservice的过程将会在下篇博客介绍 这里介绍两种方法. 使用 jackson 进行互转, Spring boot 项目自带的 json 和 bean 的互

    2024年01月19日
    浏览(48)
  • 解决Spring Boot单元测试中@Autowired依赖注入失效的问题

    本文介绍了在Spring Boot单元测试中使用@Autowired注入的方法中,由于使用反射导致依赖注入失效的问题,以及如何使用AutowiredAnnotationBeanPostProcessor手动处理依赖注入来解决这个问题。 在Spring Boot的单元测试中,我们经常使用@Autowired注解来自动注入需要测试的对象或依赖。然而,

    2024年02月03日
    浏览(55)
  • Spring Boot整合Log4j2.xml的问题

    Spring Boot整合Log4j2.xml的时候返回以下错误: Caused by: org.apache.logging.log4j.LoggingException: log4j-slf4j-impl cannot be present with log4j-to-slf4j 进行了解决。 Spring Boot整合Log4j2.xml经过以下操作: 配置 log4j2.xml 添加到 src/main/resources 目录下 Gradle的配置:在 build.gradle 中添加: 启动应用,返回以

    2024年02月09日
    浏览(37)
  • 解决Spring Boot项目中pom.xml环境配置 打包后生效 但idea版本运行无效的问题

    上文 Spring Boot中通过maven进行多环境配置 中我们通过pom.xml配置了环境选择 但这个只有在打包出来的jar中生效 我们直接通过 idea启动 这个东西确实是有点问题 其实 我们执行一下 compile 手工编译一下 然后重新启动 很明显 我们这里配置就已经生效了 这个就是 我们每次改pom.x

    2024年02月10日
    浏览(49)
  • SSM项目集成Spring Security 4.X版本(使用spring-security.xml 配置文件方式)

    目录 前言 实战开发: 一、Spring Security整合到SSM项目 1. pom文件引入包 2. web.xml 配置 3. 添加 spring-security.xml 文件 二、Spring Security实战应用 1. 项目结构 2. pom文件引入 3. web.xml 配置 4. Spring 配置 applicationContext.xml 5. spring-security.xml 配置 6. springmvc.xml 配置 7. 创建实体类 8. DAO层实

    2024年01月24日
    浏览(47)
  • Spring Boot 与 Spring Security

    Spring Security最初是由Ben Alex开发的,他是Acegi Security的创始人之一。Acegi Security是一个基于Spring框架的安全框架,它提供了一套完整的安全解决方案,包括认证、授权、攻击防护等功能,可以轻松地集成到Spring应用程序中,保护应用程序的安全性。 2008年,SpringSource收购了Aceg

    2024年02月08日
    浏览(41)
  • Spring Boot开发Spring Security

            这里我对springboot不做过多描述,因为我觉得学这个的肯定掌握了springboot这些基础 Spring Security为我们提供了登录页面,这里我是将 \\\"/\\\",路径设置为登陆页面的路径,方便测试, 也可以自定义登录页面,我会在后面说明         至于为什么不是yml,这完全不是这里

    2024年01月25日
    浏览(45)
  • Spring Boot 与 Spring Security:核心讲解(2)

    过滤器链是Spring Security的核心,它在请求到达应用程序之前对其进行拦截,以便进行身份验证和授权等操作。过滤器链由多个过滤器组成,每个过滤器负责一个特定的安全任务,例如身份验证、授权、会话管理等。过滤器链中的过滤器按照顺序依次执行,直到最后一个过滤器

    2024年02月08日
    浏览(47)
  • 在Spring Boot框架中集成 Spring Security

    技术介绍 SpringSecurity的核心功能: SpringSecurity特点: 具体实现 1、集成依赖 2、修改spring security 实现service.impl.UserDetailsServiceImpl类 代码1具体解释 代码2具体解释 实现config.SecurityConfig类 代码具体解释 总结 Spring Security是一个基于Spring框架的安全性框架,它提供了一系列的安全性

    2024年02月14日
    浏览(49)
  • spring boot security验证码登录示例

    在spring boot security自定义认证一文,基本给出了一个完整的自定义的用户登录认证的示例,但是未涉及到验证的使用,本文介绍登录的时候如何使用验证码。 本文介绍一个验证码生成工具,比较老的一个库了,仅作demo使用,不太建议生产用了,因为如果你的代码需要进行安全

    2024年02月12日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包