1. 程式人生 > >訪問專案域彈出瀏覽器原生登入框----Spring Security登陸認證 LDAP認證

訪問專案域彈出瀏覽器原生登入框----Spring Security登陸認證 LDAP認證

springSecurity的登入驗證是由org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter這個過濾器來完成的,在該類的父類AbstractAuthenticationProcessingFilter中有一個AuthenticationManager介面屬性,驗證工作主要是通過這個AuthenticationManager介面的例項來完成的。在預設情況下,springSecurity框架會把org.springframework.security.authentication.ProviderManager

類的例項注入到該屬性,

AuthenticationManager介面的相關類圖如下:

UsernamePasswordAuthenticationFilter的驗證過程如下:

1. 首先過濾器會呼叫自身的attemptAuthentication方法,從request中取出authentication, authentication是在org.springframework.security.web.context.SecurityContextPersistenceFilter過濾器中通過捕獲使用者提交的登入表單中的內容生成的一個org.springframework.security.core.Authentication

介面例項.

2. 拿到authentication物件後,過濾器會呼叫ProviderManager類的authenticate方法,並傳入該物件

3.ProviderManager類的authenticate方法再呼叫自身的doAuthentication方法,在doAuthentication方法中會呼叫類中的List<AuthenticationProvider> providers集合中的各個AuthenticationProvider介面實現類中的authenticate(Authentication authentication)方法進行驗證,由此可見,真正的驗證邏輯是由各個各個AuthenticationProvider介面實現類來完成的,DaoAuthenticationProvider類是預設情況下注入的一個AuthenticationProvider介面實現類

4.AuthenticationProvider介面通過UserDetailsService來獲取使用者資訊

以下為時序圖:

spring-security使用者許可權認證框架

 2011-10-19 13:15  

spring中沒有提供預設的許可權管理模組,而是基於Acegi開發了一個spring-security,它是基於spring的使用者許可權認證框架。spring-security是一個比較輕量的許可權認證框架,它沒有實現管理介面,只給出了相應的介面。

目錄

在web.xml配置檔案中新增過濾器:

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

然後在<classpath>路徑下建立配置檔案PROJECT-security.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
    xmlns:beans="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
                        http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
                        http://www.springframework.org/schema/security
                        http://www.springframework.org/schema/security/spring-security-2.0.xsd">

    <http auto-config="true" access-denied-page="/access_denied.jsp">
        <intercept-url pattern="/admin/**" access="ROLE_ADMIN" />
        <intercept-url pattern="/user/**" access="ROLE_USER" />

        <form-login login-page="/login.htm" authentication-failure-url="/login.htm?error=1" default-target-url="/" />
        <remember-me data-source-ref="dataSource" />
        <logout invalidate-session="true" logout-success-url="/" />
        <!--
        Uncomment to enable X509 client authentication support
        <x509 />
          -->
    </http>

    <authentication-provider>
        <!--
        <password-encoder hash="md5" />
          -->
        <jdbc-user-service data-source-ref="dataSource"
            users-by-username-query="select account as username, password, status as enabled from user where account=?"
            authorities-by-username-query="select account as username, authority from user where account=?" />
    </authentication-provider>
</beans:beans>

同時將該配置檔案加到web.xml的 <context-param> 裡。

spring-security中使用角色來分類管理使用者許可權,如上面的配置中就包含了ROLE_ADMIN和ROLE_USER兩個角色,並分別有/admin/和/user/的URL路徑下的許可權。

使用者的帳號密碼有幾種不同的方式儲存,包括xml中、LDAP和資料庫中等。上面使用的是儲存到資料庫中的方式,使用了之前在applicationContext.xml中配置的dataSource bean。使用資料庫儲存帳號時,需要按照spring-security規定的欄位來建表,有兩個相關的表,分別用於儲存帳號密碼和登入狀態。使用MySQL可以這樣建立:

CREATE TABLE `user` (
  `account` varchar(50) NOT NULL,
  `password` varchar(50) NOT NULL,
  `authority` varchar(50) NOT NULL,
  `status` tinyint(1) NOT NULL,
  UNIQUE KEY `account` (`account`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `persistent_logins` (
  `username` varchar(64) NOT NULL,
  `series` varchar(64) NOT NULL,
  `token` varchar(64) NOT NULL,
  `last_used` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`series`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

預設spring-security中採用明文方式儲存密碼,可以通過設定 <password-encoder> 來對密碼加密。這時對應的使用者註冊模組也要將密碼以加密後的資料儲存到資料庫中才行。

import org.springframework.security.providers.encoding.Md5PasswordEncoder;
import org.springframework.security.providers.encoding.PasswordEncoder;

PasswordEncoder encoder = new Md5PasswordEncoder();
String password = encoder.encodePassword(form.getPassword(), null);

可以通過會話控制來防止使用者重複登入,這可以通過配置來實現。首先在web.xml中新增監聽:

<listener>
    <listener-class>org.springframework.security.ui.session.HttpSessionEventPublisher</listener-class>
</listener>

然後在PROJECT-security.xml配置檔案中的 <http></http> 內新增:

<concurrent-session-control max-sessions="1" exception-if-maximum-exceeded="true" />

max-sessions="1" 表示該使用者同時登入的最大會話數為1,exception-if-maximum-exceeded="true" 表示阻止超出的使用者登入。

spring-security給出了在jsp中使用的介面。使用者登入可以使用下面的表單:

<form name='f' action='/PROJECT/j_spring_security_check' method='POST'>
<table>
  <tr><td>使用者名稱:</td><td><input type='text' name='j_username' value=''></td></tr>
  <tr><td>密碼:</td><td><input type='password' name='j_password'/></td></tr>
  <tr><td></td><td><input type='checkbox' name='_spring_security_remember_me'/> 自動登入</td></tr>
  <tr><td colspan='2' align="right"><input name="reset" id="reset" type="reset" value="重置" /> <input name="submit" id="submit" type="submit" value="登入" /></td></tr>
</table>
</form>

根據登入使用者進行條件判斷可以使用下面的方式:

<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>

<sec:authorize ifAllGranted="ROLE_ANONYMOUS">
<!-- ... -->
</sec:authorize>
<sec:authorize ifAllGranted="ROLE_USER">
<!-- ... -->
</sec:authorize>

在特定jsp頁面獲取登入使用者的帳號的方法是:

<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>

<input name="customer" type="hidden" value="<sec:authentication property='principal.username' />" />

spring-security還有很多相關的用法,可以檢視 官方的文件


相關推薦

訪問專案瀏覽器原生登入----Spring Security登陸認證 LDAP認證

springSecurity的登入驗證是由org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter這個過濾器來完成的,在該類的父類AbstractAuthenticationProcessingF

javascript如何一個div登入

方法一:在body中輸入如下程式碼 <div id=win style="display:none; POSITION:absolute; left:50%; top:50%; width:600px; height:400px; margin-left:-300p

js瀏覽器視窗,並指定瀏覽器大小

<!-JavaScript開啟新的瀏覽器視窗,--> <!-window.open([URL],[視窗名稱],[引數字串])-> <!-URL:可選引數,在視窗中要顯示網頁的網址或路徑。如果省略這個引數,或者它的值是空字串,那麼視窗就不顯示任何文件。視窗名稱:可

Win7 安裝Anaconda3完整過程記錄(附加無法瀏覽器問題處理)

  【安裝環境】 1.Win7 64位 旗艦版 2.已安裝Python3.7 【前情】 最近在安裝Anaconda3的時候,前面的環節沒啥問題,除了路徑都是一路預設。安裝後直接點選jupyter無法彈出預設瀏覽器,需要手動複製命令列裡面的連結 -。-!   【安裝過程】(

javascript瀏覽器的三種提示:提示資訊、確認、輸入文字

瀏覽器的三種提示框: alert()提示資訊框 confirm()提示確認框 prompt()提示輸入文字框 1、alert()提示資訊框 效果: 實現程式碼:

vue專案把底部按鈕頂上去

問題描述: vue專案,如下頁面,點選新增會出現個彈出框,在ios真機操作,彈出框出現後,背景會往上滑。 上圖是在pc除錯的,並不是有bug的頁面,bug頁面請參照上文描述。 如果你的頁面上滑已經被你解決了(例如給背景設定固定座標等方法),但是你在輸入框裡輸入了東西,點選取消或者確

修改hosts不管用 為什麼修改127 0 0 1指向的域名,訪問域名卻別的網站

                linux上的hosts: 一般在LINUX下修改完/etc/hosts

selenium使用chrome進行登入時如何關閉的密碼提示

最近在使用chrome登入網站的時候總有密碼儲存提示框(並不是所有的都會有密碼儲存提示框) 其實只需要設定啟動chrome的相關引數就可以避免這種問題,引數: prefs[“credentials_enable_service”] = False pref

Android開發 activity裡面的WebView載入js呼叫windows.location.reload()會瀏覽器的解決方法

原文地址:http://www.it1352.com/131085.html 重寫WebView的WebViewClient public class MyWebViewClient extends WebViewClient { @Overri

解決移動端文字原生鍵盤後擋住文字

記一次,解決移動端文字框彈出鍵盤遮擋輸入框的方法: document.activeElement.scrollIntoViewIfNeeded(); 方法用來將不在瀏覽器視窗的可見區域內的元素滾動到

關於selenium關閉chrome密碼登入的密碼提示

options = webdriver.ChromeOptions() prefs = {"":""} prefs["credentials_enable_service"] = False prefs["profile.password_manager_enabled"] = False options.a

如何QQ臨時對話實現不添加好友在線交談效果

*** brush ref nbsp alt lan 驗證 組件 真的 如何不添加好友彈出QQ臨時對話框實現在線交談效果,這樣的一個需求,我們真的是太需要了,實現起來也很簡單,一行代碼即可搞定,需要的朋友可以參考下 其實這個很簡單,在img我們加入一個a標簽,然後

解決win10打開組策略管理模板對話問題

windows htm 解決 take .html 全選 In 描述 idt 今天win10企業版更新完系統,打開組策略編輯器時彈出管理模板對話框問題 1、問題描述 打開組策略編輯器時彈出管理模板對話框問題 2、解決方法 1)window+x 打開命令提示符(管理員

Android輸入法時覆蓋輸入問題

express anti 參考 inpu contex 針對 screen .org apply 本文來自網易雲社區 作者:孫有軍 當一個activity中含有輸入框時,我們點擊輸入框,會彈出輸入法界面,整個界面的變化效果與manifest中對應設置的android

matlab guide對話方塊+滑動條+式選單+列表的使用

文章目錄 前言 matlab資料傳遞概觀 對話方塊建立 利用滑動條實現顏色調控 利用彈出式選單選擇並輸入文字框 利用列表框選擇並輸入文字框 前言 我覺得g

springboot+thymeleaf實現匯出excel下載路徑選擇

最近專案上需要寫一個匯出excel功能,在開始的時候用ajax傳送請求,不彈出匯出路徑選擇框,後來在網上搜了一些資料,找到了問題所在,做一下總結: 前端頁面:thymeleaf 後端語言:java  匯出Excel:POI模式 1.ajax請求只是個“字元型”的請求,

ios學習筆記之-點選一個按鈕撥打電話提示

按鈕的程式碼就不寫了。直接寫主要程式碼。 <key>LSApplicationQueriesSchemes</key> <array> <string>tel</string> <string>telp

android-鍵盤以及輸入的設定

1、開啟Activity時先不彈出鍵盤 解決方案: 在AndroidManifest.xml中設定Activity與鍵盤的互動模式,即android:windowSoftInput屬性,它能影響兩個地方:  1、產生焦點時,軟鍵盤是否隱藏;  2、是否減少活動主視窗大小以

jQuery實現自定義樣式的視窗和確認

(function () { $.MsgBox = { Alert: function (title, msg) { GenerateHtml("alert", title, msg); btn

點input一個多選checkbox,進行選擇,每個以逗號隔開

點input框,彈出一個多選框,進行選擇,每個以逗號隔開,如上圖所示 1. <input id="taskPlanDay" name="taskPlanDay" type="text" style="width: 150px" class="inputxt" rea