资讯专栏INFORMATION COLUMN

spring-boot登陆过滤功能

taoszu / 2311人阅读

摘要:工程除了提供后端的路由转发,还可以做全局的过滤器,所以我选择在这个工程里面写登陆校验功能。如果校验成功,返回登陆成功,否则,返回登陆失败。前端再根据登陆情况做路由跳转。登陆成功登陆失败最后,贴一下启动类的代码

先简单说一下我们工程的架构:前端工程是采用react,后端工程采用spring-cloud,里面分为zuul工程和其他功能模块。zuul工程除了提供后端的路由转发,还可以做全局的过滤器,所以我选择在这个工程里面写登陆校验功能。

session配置

这里使用redis存储session信息。
下载依赖,在pom.xml里面加入


    org.springframework.boot
    spring-boot-starter-data-redis


    org.springframework.session
    spring-session-data-redis

配置session存储,在application.yml里面加入

session:
    store-type: redis
    timeout: 30
redis:
    database: 0
    host: 
    password: 
    port: 6379
    timeout: 300000

session超时,在application.yml里面配置timeout貌似没有效果,我们在启动类里面加入超时配置注解

@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 7200, redisFlushMode = RedisFlushMode.IMMEDIATE)

添加redis类配置,新建一个redisConfig类,然后写入

package com.config;

import org.springframework.context.annotation.Configuration;

@Configuration
public class RedisConfig {

    public RedisConfig() {

    }

}
过滤器

这里使用zuulFilter,实现了每个http请求都经过这个过滤器,然后通过session中是否存在用户名,判断session是否超时。如果超时就返回错误提示,前端再根据超时的http请求码进行跳转。

package com.config;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.ztesoft.cloud.Service.StaffService;
import com.ztesoft.cloud.model.User;
import org.springframework.beans.factory.annotation.Autowired;

import javax.servlet.http.HttpServletRequest;

public class WebSecurityFilter extends ZuulFilter {

    @Override
    public String filterType() {
        return "pre";//前置过滤器
    }

    @Override
    public int filterOrder() {
        return 0;//优先级为0,数字越大,优先级越低
    }

    @Override
    public boolean shouldFilter() {
        return true;//是否执行该过滤器,此处为true,说明需要过滤
    }


    @Autowired
    private StaffService staffService;

    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        String queryString = request.getQueryString();
        Object username = request.getSession().getAttribute("username");
        Object password = request.getSession().getAttribute("password");
        User user = new User();
        if(username != null) {
            user.setUsername(username.toString());
        }
        if(password != null) {
            user.setPassword(password.toString());
        }
        Boolean verifyResult = this.staffService.verifyLoginUser(user);
        //queryString.indexOf("tag=process") > -1)是为了外系统调用这个系统跳过登陆约定传过来的值
        if ((queryString != null && queryString.indexOf("tag=process") > -1) || verifyResult) {
            ctx.setSendZuulResponse(true);// 对该请求进行路由
            ctx.setResponseStatusCode(200);
            ctx.set("isSuccess", true);// 设值,可以在多个过滤器时使用
            return null;
        } else {
            ctx.setSendZuulResponse(false);// 过滤该请求,不对其进行路由
            ctx.setResponseStatusCode(401);// 返回错误码,应该是401
            ctx.setResponseBody("session is out of time");// 返回错误内容
            ctx.set("isSuccess", false);
            return null;
        }
    }
}

这里还需要在启动类中注入这个类

    @Bean
    public WebSecurityFilter accessFilter() {
        return new WebSecurityFilter();
    }
登陆的代码

主要就是把前端传来的用户名密码放到session中,并进行校验。如果校验成功,返回登陆成功,否则,返回登陆失败。前端再根据登陆情况做路由跳转。

package com.controller;

@RestController
@RequestMapping(value = "/system")
public class SystemController extends JdkSerializationRedisSerializer implements Serializable {

    @Autowired
    private StaffService staffService;

    @PostMapping("login")
    public ResponseEntity login(@RequestBody User user, HttpSession session) {
        session.setAttribute("username", user.getUsername());
        session.setAttribute("password", user.getPassword());
        Boolean ret = this.staffService.verifyLoginUser(user);
        if(ret == true) {
            return new ResponseEntity<>("登陆成功", HttpStatus.OK);
        }
        return new ResponseEntity<>("登陆失败", HttpStatus.NON_AUTHORITATIVE_INFORMATION);
    }

}

最后,贴一下启动类的代码

@SpringBootApplication
@EnableDiscoveryClient
@EnableZuulProxy
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 7200, redisFlushMode = RedisFlushMode.IMMEDIATE)
@ComponentScan(excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = RibbonConfig.class))
@RibbonClients(defaultConfiguration = RibbonConfig.class)
public class PlatformWebApplication {

    @Bean
    public WebSecurityFilter accessFilter() {
        return new WebSecurityFilter();
    }

    public static void main(String[] args) {
        SpringApplication.run(PlatformWebApplication.class, args);
    }
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/72808.html

相关文章

  • Spring-boot、Shrio实现JWT

    摘要:截获页面错误处理逻辑关于权限等授权信息,可以直接放到中实现缓存。我认为也是不错的。源码奉上分支温馨提示平时测试代码可能比较乱。如果更好的实现,让我学习,让我我进步,请联系我。 关于验证大致分为两个方面: 用户登录时的验证; 用户登录后每次访问时的权限认证 主要解决方法:使用自定义的Shiro Filter 项目搭建: 这是一个spring-boot 的web项目,不了解spring...

    qylost 评论0 收藏0
  • [译]Spring入门 - Web应用程序安全

    摘要:一旦最基本的应用创建好了,你可以给他加上安全防护。一旦成功登出了,我们的应用程序重定向到到并显示相应的登陆成功的消息。这标记该应用程序是一个应用程序,并激活一些关键行为,比如创建一个。一旦应用程序启动,用浏览器访问。 原网页 https://spring.io/guides/gs/securing-web/ 本指南将引导您完成创建一个资源由Spring Security的保护的一个简单...

    AlexTuan 评论0 收藏0
  • spring-boot跨域

    摘要:无拦截器一般情况下直接用就可以搞定了有拦截器比如需要对用户身份进行验证浏览器在发送请求时可能这个我还要去一下不会带上验证信息在拦截器那里就没通过进而结束请求而前面方法的执行是在拦截器后面不会起作用当然在拦截器那里判断如果是方法就通过也没问题 无拦截器 @CrossOrigin 一般情况下,直接用@CrossOrigin就可以搞定了 @CrossOrigin(origins = ...

    tomato 评论0 收藏0
  • Spring Boot - 自定义启动banner

    摘要:背景这段时间较忙,有些想念小红,为了表达我对小红的思念之情,决定将启动的研究一下,看看是否能够自定义,让我天天能够看到她。 背景 这段时间较忙,有些想念小红,为了表达我对小红的思念之情,决定将spring boot启动的banner研究一下,看看是否能够自定义,让我天天能够看到她。 展示 经过调研,发现自定义banner是一个轻松愉快的过程,忍不住让我多启动几次,先看看效果:(省略了一...

    CollinPeng 评论0 收藏0
  • Shiro【授权过滤器、与ehcache整合、验证码、记住我】

    摘要:为了达到很好的效果,我们使用来对的缓存进行管理配置会话管理器,对会话时间进行控制手动清空缓存由于验证用户名和密码之前,一般需要验证验证码的。 前言 本文主要讲解的知识点有以下: Shiro授权过滤器使用 Shiro缓存 与Ehcache整合 Shiro应用->实现验证码功能 记住我功能 一、授权过滤器测试 我们的授权过滤器使用的是permissionsAuthorization...

    K_B_Z 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<