Maison >Java >javaDidacticiel >Code d'implémentation de la fonction de filtrage de connexion de Spring-boot

Code d'implémentation de la fonction de filtrage de connexion de Spring-boot

不言
不言avant
2018-12-21 10:45:102980parcourir

Le contenu de cet article concerne la fonction de filtrage de connexion Spring-Boot. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

Parlons brièvement de l'architecture de notre projet : le projet front-end utilise React, et le projet back-end utilise spring-cloud, qui est divisé en projet zuul et d'autres modules fonctionnels. En plus de fournir le routage et le transfert back-end, le projet zuul peut également effectuer des filtres globaux, j'ai donc choisi d'écrire la fonction de vérification de connexion dans ce projet.

configuration de session

Ici, redis est utilisé pour stocker les informations de session.
Téléchargez les dépendances, ajoutez

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-data-redis</artifactId>
</dependency>

à pom.xml pour configurer le stockage de session, ajoutez

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

délai d'expiration de session à application.yml et configurez le délai d'expiration dans application.yml. semble n'avoir aucun effet. Nous ajoutons l'annotation de configuration du délai d'attente

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

à la classe de démarrage, ajoutons la configuration de la classe redis, créons une nouvelle classe redisConfig, puis écrivons le

package com.config;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RedisConfig {
    public RedisConfig() {

    }
}
filtre

Utilisez zuulFilter ici pour réaliser que chaque requête http passe par ce filtre, puis détermine si la session a expiré en fonction du fait que le nom d'utilisateur existe dans la session. S'il expire, un message d'erreur sera renvoyé et le frontal sautera en fonction du code de requête http expiré.

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);
        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;
        }
    }
}
Ici, vous devez également injecter cette classe dans la classe de démarrage

    @Bean
    public WebSecurityFilter accessFilter() {
        return new WebSecurityFilter();
    }
Le code de connexion

sert principalement à mettre le nom d'utilisateur et le mot de passe transmis depuis le front-end dans la session et effectuez la vérification. Si la vérification réussit, le succès de la connexion sera renvoyé ; sinon, l’échec de la connexion sera renvoyé. Le frontal effectue ensuite des sauts de routage en fonction de l'état de connexion.

package com.controller;

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

    @Autowired
    private StaffService staffService;

    @PostMapping("login")
    public ResponseEntity<String> 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);
    }

}
Enfin, postez le code de la classe de démarrage

@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);
    }
}


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer