Heim  >  Artikel  >  Java  >  Implementierungscode der Anmeldefilterfunktion von Spring-Boot

Implementierungscode der Anmeldefilterfunktion von Spring-Boot

不言
不言nach vorne
2018-12-21 10:45:102887Durchsuche

Der Inhalt dieses Artikels befasst sich mit der Spring-Boot-Login-Filterfunktion. Ich hoffe, dass er für Sie hilfreich ist.

Lassen Sie uns kurz über die Architektur unseres Projekts sprechen: Das Front-End-Projekt verwendet React und das Back-End-Projekt verwendet Spring-Cloud, das in Zuul-Projekte und andere Funktionsmodule unterteilt ist. Zusätzlich zur Bereitstellung von Back-End-Routing und -Weiterleitung kann das Zuul-Projekt auch globale Filter ausführen. Daher habe ich mich entschieden, die Anmeldeüberprüfungsfunktion in diesem Projekt zu schreiben.

Sitzungskonfiguration

Hier wird Redis zum Speichern von Sitzungsinformationen verwendet.
Abhängigkeiten herunterladen,

<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>

zu pom.xml hinzufügen, um den Sitzungsspeicher zu konfigurieren,

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

Sitzungstimeout zu application.yml hinzufügen und das Timeout in application.yml konfigurieren scheint keine Wirkung zu haben . Wir fügen die Timeout-Konfigurationsanmerkung

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

zur Startup-Klasse hinzu, fügen die Redis-Klassenkonfiguration hinzu, erstellen eine neue redisConfig-Klasse und schreiben dann den

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

    }
}

-Filter

hier Um es mit zuulFilter zu implementieren, durchläuft jede HTTP-Anfrage diesen Filter. Ob die Sitzung abgelaufen ist, wird dann dadurch bestimmt, ob der Benutzername in der Sitzung vorhanden ist. Bei einer Zeitüberschreitung wird eine Fehlermeldung zurückgegeben und das Frontend springt basierend auf dem abgelaufenen HTTP-Anforderungscode.

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

Hier müssen Sie diese Klasse auch in die Startup-Klasse einfügen

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

Der Anmeldecode

Die Hauptsache ist, den vom Frontend übergebenen Benutzernamen und das Passwort einzugeben in die Sitzung einbinden und eine Prüfung durchführen. Wenn die Überprüfung erfolgreich ist, wird eine erfolgreiche Anmeldung zurückgegeben. Andernfalls wird eine fehlgeschlagene Anmeldung zurückgegeben. Das Frontend führt dann Routing-Sprünge basierend auf dem Anmeldestatus durch.

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

}

Zum Schluss posten Sie den Code der Startup-Klasse

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


Das obige ist der detaillierte Inhalt vonImplementierungscode der Anmeldefilterfunktion von Spring-Boot. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen