(七)、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
16、SpringBoot單點登入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