1. 程式人生 > >(七)、SpringBoot + SpringSecurity 簡單登入認證

(七)、SpringBoot + SpringSecurity 簡單登入認證

可以前往第一篇部落格檢視目錄結構 --> 這裡

一、檢視是否依賴Spring Security相關jar包(例如: spring-boot-starter-security) ,修改demo模組下的 application.propertiies(開啟spring security認證)

//註釋掉這段配置,開啟springsecurity
#security.basic.enabled=false

二、編寫簡單的html登入頁面,放在browser模組下的 src -> main -> resources -> resources -> zeke-login.html

(表單提交地址是:/authentication/form   待會需要用到)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Login Page</title>
</head>
<body>
<form action="/authentication/form" method="post">
    <table>
        <tr>
            <td>使用者名稱:</td>
            <td><input type="text" name="username"/></td>
        </tr>
        <tr>
            <td>密碼:</td>
            <td><input type="password" name="password"/></td>
        </tr>
        <tr>
            <td colspan="2"><button type="submit">登入</button></td>
        </tr>
    </table>
</form>
</body>
</html>

三、在browser模組 src->main->java->com->zeke->browser新建support目錄,建立簡單的返回值類

public class SimpleResponse {

    private Object content;

    public SimpleResponse(Object content) {
        this.content = content;
    }

    public Object getContent() {
        return content;
    }

    public void setContent(Object content) {
        this.content = content;
    }
}

四、在browser模組 src->main->java->com->zeke->browser新建authentication目錄,建立認證失敗和認證成功的處理類(ZekeAuthenticationSuccessHandler,ZekeAuthenticationFailureHandler)

只上程式碼不解釋,自行參悟 (有基礎的應該都能懂)

ZekeAuthenticationSuccessHandler : 

@Component
public class ZekeAuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler {

    private Logger logger = LoggerFactory.getLogger(getClass());

    private static final ObjectMapper MAPPER = new ObjectMapper();

    @Autowired
    private SecurityProperties securityProperties;

    @Override
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws ServletException, IOException {
        logger.info("登入成功");

        if (LoginType.JSON.equals(securityProperties.getBrowser().getLoginType())){
            response.setContentType("application/json;charset=UTF-8");
            response.getWriter().write(MAPPER.writeValueAsString(authentication));
        }else {
            super.onAuthenticationSuccess(request, response, authentication);
        }

    }
}

ZekeAuthenticationFailureHandler : 

@Component
public class ZekeAuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler{

    private Logger logger = LoggerFactory.getLogger(getClass());

    private static final ObjectMapper MAPPER = new ObjectMapper();

    @Autowired
    private SecurityProperties securityProperties;

    @Override
    public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
        logger.info("登入失敗");

        if (LoginType.JSON.equals(securityProperties.getBrowser().getLoginType())){
            response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
            response.setContentType("application/json;charset=UTF-8");
            response.getWriter().write(MAPPER.writeValueAsString(new SimpleResponse(exception.getMessage())));
        }else {
            super.onAuthenticationFailure(request, response, exception);
        }

    }
}

五、編寫SpringSecurity配置類 -> BrowserSecurityConfig

@Configuration
public class BrowserSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private ZekeAuthenticationSuccessHandler zekeAuthenticationSuccessHandler;

    @Autowired
    private ZekeAuthenticationFailureHandler zekeAuthenticationFailureHandler;

    @Autowired
    private SecurityProperties securityProperties;

    @Bean
    public PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable();
        http.formLogin() //表單登入
                .loginPage("/authentication/require") //使用者未登入時的處理地址
                .loginProcessingUrl("/authentication/form") //使用者登入
                .successHandler(zekeAuthenticationSuccessHandler) //登入成功處理
                .failureHandler(zekeAuthenticationFailureHandler) //登入失敗處理
                .and()
                .authorizeRequests()
                .antMatchers("/authentication/require",
                        securityProperties.getBrowser().getLoginPage()) //不攔截的URL
                .permitAll()
                .anyRequest()
                .authenticated();
    }
}

六、實現UserDetailsService使用者操作介面

package com.zeke.browser;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Component;

@Component
public class MyUserDetailsService implements UserDetailsService {

    private Logger logger = LoggerFactory.getLogger(getClass());
    //一定要在配置檔案中手動注入這個介面的實現類,否則會啟動失敗或登入失敗
    @Autowired
    private PasswordEncoder passwordEncoder;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        logger.info("login username: " + username);

        String encode = passwordEncoder.encode("123456");

        logger.info("login password: " + encode);

        return new User(username,encode,
                true,true,true,true,
                AuthorityUtils.commaSeparatedStringToAuthorityList("admin"));
    }

}

七、登入請求處理類 BrowserSecurityController (未登入狀態下只有敲帶有.html字尾的地址才能直接進入登入頁面,否則自行定義需要跳轉的頁面)

@RestController
public class BrowserSecurityController {

    private Logger logger = LoggerFactory.getLogger(getClass());
    private RequestCache requestCache = new HttpSessionRequestCache();
    private RedirectStrategy redirectStrategy = new DefaultRedirectStrategy();

    @Autowired private SecurityProperties securityProperties;

    /**
     * 登入頁面請求
     * @param request
     * @param response
     * @return
     * @throws IOException
     */
    @RequestMapping("/authentication/require")
    @ResponseStatus(code = HttpStatus.UNAUTHORIZED)
    public SimpleResponse requireAuthentication(HttpServletRequest request, HttpServletResponse response) throws IOException {
        SavedRequest savedRequest = requestCache.getRequest(request, response);
        if (savedRequest != null){
            String redirectUrl = savedRequest.getRedirectUrl();
            logger.info("引發跳轉的請求是:" + redirectUrl);
            if (StringUtils.endsWithIgnoreCase(redirectUrl,".html")){
                redirectStrategy.sendRedirect(request,response,securityProperties.getBrowser().getLoginPage());
            }
        }
        return new SimpleResponse("訪問的伺服器需要身份認證,請引導使用者驗證登入頁");
    }

}

八、啟動專案 訪問 localhost/zeke-login.html , 輸入任意使用者名稱和密碼123456(已在程式碼中定義),檢視日誌登入成功即可

相關推薦

()SpringBoot + SpringSecurity 簡單登入認證

可以前往第一篇部落格檢視目錄結構 --> 這裡一、檢視是否依賴Spring Security相關jar包(例如: spring-boot-starter-security) ,修改demo模組下的 application.propertiies(開啟spring sec

Spring Cloud之路:(SpringBoot+Shiro實現登入認證和許可權管理

一、Shiro介紹 1、Shiro是什麼? Shiro是Apache下的一個開源專案,我們稱之為Apache Shiro。它是一個很易用與Java專案的的安全框架,提供了認證、授權、加密、會話管理,與 Spring Security 一樣都是做一個許可權的安全框架,但是與Spri

springBoot 簡單優雅是實現檔案上傳和下載

前言 好久沒有更新spring Boot 這個專案了。最近看了一下docker 的知識,後期打算將spring boot 和docker 結合起來。剛好最近有一個上傳檔案的工作呢,剛好就想起這個腳手架,將檔案上傳和下載整理進來。 配置 在application.properties 中增加上傳檔案存放的路徑配

springboot整合Spring-data-jpa

ast bstr 核心 public html 特殊 ssi 除了 使用方法 1.Spring Data JPA是什麽   由Spring提供的一個用於簡化JPA開發的框架。可以在幾乎不用寫實現的情況下,實現對數據的訪問和操作。除了CRUD外,還包括如分頁、排序等一些常用的

Springboot2.0整合Shiro框架系列-簡單登入認證(一)

Shiro簡介 Apache Shiro 是 Java 的一個安全框架。Shiro 可以非常容易的開發出足夠好的應用,其不僅可以用在 JavaSE 環境,也可以用在JavaEE 環境。Shiro 可以幫助我們完成,認證、授權、加密、會話管理、與Web整合、快

記住密碼自動登入

1.activity_main.xml: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android.c

SpringBoot整合Shiro登入認證和授權(附demo)

SpringBoot整合Shiro登入認證和授權 廢話不多說,直接上程式碼: 程式碼有點多,想直接拿demo的直接拉到底 ps:demo忘了在哪拿的了,在他的基礎上改了一些 步驟一:pom.xml匯入依賴jar包 <dependencies

SpringSecurity實現登入認證及許可權驗證

目標 在原公司有專門的登入驗證和許可權管理服務,換公司後在最近專案中需要使用Spring Security自主實現分散式系統的使用者驗證授權及許可權驗證功能,因此花了兩天時間研究並實現了該方案: 功能點細分: 1. 基於REST請求的登入 2. 使用

spring-boot(八) springboot整合shiro-登入認證和許可權管理

Apache Shiro What is Apache Shiro? Apache Shiro是一個功能強大、靈活的,開源的安全框架。它可以乾淨利落地處理身份驗證、授權、企業會話管理和加密。 Apache Shiro的首要目標是易於使用和理解。安全通常很複雜,甚至讓人感到很痛苦,但是Shiro卻不是

SpringBoot原始碼學習之路(SpringBoot中對SpringMVC的自動配置)

SpringMVC自動配置 一. Spring MVC auto-configuration 對於SpringMVC的自動配置下面只是介紹了部分,如果想要了解更多Boot對SpringMVC的預設配置可以查閱原始碼結合官方文件瞭解。 原始

SpringBoot配置連線池

內建的連線池 目前Spring Boot中預設支援的連線池有dbcp,dbcp2, tomcat, hikari三種連線池。 資料庫連線可以使用DataSource池進行自動配置。 由於Tomcat資料來源連線池的效能和併發,在tomcat可用時,我們總

springboot(十四):springboot整合shiro-登入認證和許可權管理

這篇文章我們來學習如何使用Spring Boot整合Apache Shiro。安全應該是網際網路公司的一道生命線,幾乎任何的公司都會涉及到這方面的需求。在Java領域一般有Spring Security、Apache Shiro等安全框架,但是由於Spring Sec

springboot整合shiro-登入認證和許可權管理

這篇文章我們來學習如何使用Spring Boot整合Apache Shiro。安全應該是網際網路公司的一道生命線,幾乎任何的公司都會涉及到這方面的需求。在Java領域一般有Spring Security、Apache Shiro等安全框架,但是由於Spring Securit

16SpringBoot單點登入SSO資料庫實現

    首先以一張圖形式說明單點認證的整個流程:    前一篇文章中,我們使用了記憶體寫死的模式實現使用者的授權和資源的保護,當然token以及clients資訊儲存有多種方式,有inmemory記憶體模式、redis儲存模式、jdbc儲存模式、jwt儲存模式、jwk儲

spring boot入門(springboot的攔截器Interceptor。最完整簡單易懂詳細的spring boot教程。

很多同學搞不懂攔截器和過濾器的區別,我們先說一下他們的區別: 過濾器和攔截器非常相似,但是它們有很大的區別 最簡單明瞭的區別就是過濾器可以修改request,而攔截器不能 過濾器需要在servlet容器中實現,攔截器可以適用於javaEE,javaSE等各種環境 攔截

SpringBoot整合SpringSecurity簡單實現登入登出從零搭建

1 . 新建一個spring-security-login的maven專案 ,pom.xml新增基本依賴 : <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"

SpringBoot從入門到放棄》之第(十一)篇——使用@Scheduled建立定時任務,cron子表示式的簡單使用

模擬場景:有時候,你需要每天某個點或者每週、每個月讓程式做一些事情,如呼叫介面獲取資料,比如生成資料的報表,或者統計一些資料之類,你除了可以在資料庫建立儲存過程,還可以寫Java定時任務。 O的K,接著上一篇的開發環境。《SpringBoot從入門到放棄》之第(十)篇 我們建立一個定時任

shiro,基於springboot,基於前後端分離,從登入認證到鑑權,從入門到放棄

這個demo是基於springboot專案的。 名詞介紹: ShiroShiro 主要分為 安全認證 和 介面授權 兩個部分,其中的核心元件為 Subject、 SecurityManager、 Realms,公共部分 Shiro 都已經為我們封裝好了,我們只需要按照一定的規則去編寫響應的程式碼即可…

springboot+shrio簡易登入登出和使用者許可權認證

原始碼:https://github.com/huangshengz/myJavaDemo本例子參考:https://www.cnblogs.com/HowieYuan/p/9259638.html本例子驗證主要有兩個類,一個是自定義的攔截類ShiroConfig,在這裡我們自定義了很多需要的操作。例如:角色

基於SpringBoot搭建應用開發框架(二) —— 登入認證

零、前言 本文基於《基於SpringBoot搭建應用開發框架(一)——基礎架構》,通過該文,熟悉了SpringBoot的用法,完成了應用框架底層的搭建。 在開始本文之前,底層這塊已經有了很大的調整,主要是SpringBoot由之前的 1.5.9.RELEASE 升級至 2.1.0.RELEASE