springSecurity簡單使用

目錄

傳統用戶名登錄流程

使用SpringSecurity的流程

一.maven導入依賴

二.在web.xml中配置過濾器(固定寫法)

三.編寫spring-security.xml文件

1.無數據庫情況下使用spring-security

 2.有數據庫情況下的springSecurity.xml

四.創建對應的頁面文件

五.創建業務類存入ioc容器,按上方配置的userService名稱來,開啓事務

5.1涉及到的框架類:

六.退出操作


 

傳統用戶名登錄流程

使用SpringSecurity的流程

一.maven導入依賴

	<properties>
		<spring.version>5.0.2.RELEASE</spring.version>
		<spring.security.version>5.0.1.RELEASE</spring.security.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context-support</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<!-- springSecurity需要使用的插件start-->
		<dependency>
			<groupId>org.springframework.security</groupId>
			<artifactId>spring-security-web</artifactId>
			<version>${spring.security.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.security</groupId>
			<artifactId>spring-security-config</artifactId>
			<version>${spring.security.version}</version>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>3.1.0</version>
			<scope>provided</scope>
		</dependency>
        
            <!-- springSecurity需要使用的插件end-->

	</dependencies>
	<build>
		<plugins>
			<!-- java編譯插件 -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.2</version>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
					<encoding>UTF-8</encoding>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.tomcat.maven</groupId>
				<artifactId>tomcat7-maven-plugin</artifactId>
				<configuration>
					<!-- 指定端口 -->
					<port>8090</port>
					<!-- 請求路徑 -->
					<path>/</path>
				</configuration>
			</plugin>
		</plugins>
	</build>

二.在web.xml中配置過濾器(固定寫法)

<!-- 需要配置spring容器-->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
<!-- 加載配置文件-->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:spring-security.xml</param-value>
	</context-param>

<!-- 過濾器-->
	<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>

三.編寫spring-security.xml文件

1.無數據庫情況下使用spring-security

	<!-- 配置不過濾的資源(靜態資源及登錄相關) -->
<security:http security="none" pattern="/login.html" />
<security:http security="none" pattern="/failer.html" />
<security:http auto-config="true" use-expressions="false" >
	<!-- 配置資料連接,表示任意路徑都需要ROLE_USER權限 -->
	<security:intercept-url pattern="/**" access="ROLE_USER" />
	<!-- 自定義登陸頁面,
	login-page 自定義登陸頁面 
	authentication-failure-url 
		用戶權限校驗失敗之後纔會跳轉到這個頁面,如果數據庫中沒有這個用戶則不會跳轉到這個頁面。 
	default-target-url 登陸成功後跳轉的頁面。 
	注:登陸頁面用戶名固定 username,密碼 password,action:login -->
	<security:form-login 
		login-page="/login.html"
		login-processing-url="/login" 
		username-parameter="username"
		password-parameter="password" 
		authentication-failure-url="/failer.html"
		default-target-url="/success.html" 
		authentication-success-forward-url="/success.html"
		/>
	<!-- 登出, 
		invalidate-session 是否刪除
		session logout-url:登出處理鏈接 
		logout-success-url:登出成功頁面 
		注:登出操作 只需要鏈接到 logout即可登出當前用戶 -->
	<security:logout 
		invalidate-session="true" logout-url="/logout"
		logout-success-url="/login.jsp" />

	<!-- 關閉CSRF,默認是開啓的(跨服務器登錄的一個選項) -->
	<security:csrf disabled="true" />

	</security:http>
    <!-- (此處是不需要數據庫時使用)-->
	<security:authentication-manager>
		<security:authentication-provider>
			<security:user-service>
				<security:user name="user" password="{noop}user"
					authorities="ROLE_USER" />
				<security:user name="admin" password="{noop}admin"
					authorities="ROLE_ADMIN" />
			</security:user-service>
		</security:authentication-provider>
	</security:authentication-manager>

 2.有數據庫情況下的springSecurity.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:security="http://www.springframework.org/schema/security"
	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.xsd          
    http://www.springframework.org/schema/security          
    http://www.springframework.org/schema/security/spring-security.xsd">
    
    <!-- 配置不攔截的資源 -->
    <security:http pattern="/login.jsp" security="none"/>
    <security:http pattern="/failer.jsp" security="none"/>
    <security:http pattern="/css/**" security="none"/>
    <security:http pattern="/img/**" security="none"/>
    <security:http pattern="/plugins/**" security="none"/>
    
    <!-- 
    	配置具體的規則 
    	auto-config="true"	不用自己編寫登錄的頁面,框架提供默認登錄頁面
    	use-expressions="false"	是否使用SPEL表達式(沒學習過)
    -->
    <security:http auto-config="true" use-expressions="false">
    	<!-- 配置具體的攔截的規則 pattern="請求路徑的規則" access="訪問系統的人,必須有ROLE_USER的角色" -->
    	<security:intercept-url pattern="/**" access="ROLE_USER,ROLE_ADMIN"/>
    	
    	<!-- 定義跳轉的具體的頁面
            注:登陸頁面用戶名固定 username,密碼 password,action:login -->
    	<security:form-login  
    		login-page="/login.jsp"
            <!--該處是login.jsp頁面請求的路徑-->
    		login-processing-url="/login.do"
    		default-target-url="/index.jsp"
    		authentication-failure-url="/failer.jsp"
    	/>
    	
    	<!-- 關閉跨域請求 -->
    	<security:csrf disabled="true"/>
    	
    	<!-- 退出 -->
    	<security:logout invalidate-session="true" logout-url="/logout.do" logout-success-url="/login.jsp" />
    	
    </security:http>
    
    <!-- 切換成數據庫中的用戶名和密碼 -->
    <security:authentication-manager>
        <!-- 設置登錄的業務類 需要將該類配置到ioc容器中 -->
    	<security:authentication-provider user-service-ref="userService">
    		<!-- 配置加密的方式 -->
    		<security:password-encoder ref="passwordEncoder"/>
    	</security:authentication-provider>
    </security:authentication-manager>
    
    <!-- 配置加密類 -->
    <bean id="passwordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>
    
    <!-- 提供了入門的方式,在內存中存入用戶名和密碼 
    <security:authentication-manager>
    	<security:authentication-provider>
    		<security:user-service>
    			<security:user name="admin" password="{noop}admin" authorities="ROLE_USER"/>
    		</security:user-service>
    	</security:authentication-provider>
    </security:authentication-manager>
    -->
    
 </beans>   

 

  • default-target-url 是登陸成功後跳轉的頁面,這裏設置跳轉到index.jsp

å¨è¿éæå¥å¾çæè¿°

  • authentication-success-forward-url,是指相當於下面的圖示中箭頭部分的代碼 給登陸成功後跳轉的 index.jsp設置了一個請求轉發,所以spring security 能更方便的管理 不需要寫以下箭頭的那段代碼

å¨è¿éæå¥å¾çæè¿°

四.創建對應的頁面文件

五.創建業務類存入ioc容器,按上方配置的userService名稱來,開啓事務

5.1涉及到的框架類:

  • org.springframework.security.core.userdetails.UserDetailsService:業務接口繼承此類,實現其中loadUserByUsername方法

  • org.springframework.security.core.userdetails.UserDetails:loadUserByUsername方法返回對象

  • org.springframework.security.core.userdetails.User:UserDetails接口實現類,作爲loadUserByUsername方法返回值

  • org.springframework.security.core.GrantedAuthority:User構造方法控制權限參數

  • org.springframework.security.core.authority.SimpleGrantedAuthority:GrantedAuthority方法實現類

 

  • 該業務類接口必須繼承UserDetailsService,該接口的實現類需實現loadUserByUsername方法

  • 在loadUserByUsername方法中定義User類返回(可查看UserDetailsService源碼以及繼承關係知道該類,使用以下構造方法)

username:用戶名

password:密碼

enabled:該用戶是否激活

authorities:用戶角色列表(List<SimpleGrantedAuthority>)

package com.gaipian.service.impl;

import com.gaipian.dao.IUserDao;
import com.gaipian.domaim.Role;
import com.gaipian.domaim.UserInfo;
import com.gaipian.service.IUserService;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

@Service("userService")
@Transactional
public class UserServiceImpl implements IUserService {

    @Resource(name = "userDao")
    private IUserDao userDao;


    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        UserInfo userInfo = null;
        try {
            userInfo = userDao.findByUser(username);
        } catch (Exception e) {
            e.printStackTrace();
        }

        //{noop}該處此時必須要加,不然會報錯
        User user = new User(userInfo.getUsername(),"{noop}"+userInfo.getPassword(),userInfo.getStatus()==1?true:false,true,true,true,getAuthorities(userInfo.getRoles()));


        return user;
    }

    // SimpleGrantedAuthority 是 authorities參數的實現類
    public List<SimpleGrantedAuthority> getAuthorities(List<Role> roles){

        List<SimpleGrantedAuthority> list = new ArrayList<>();
        //一定要遍歷,此時角色與用戶是多對多的關係
        for (Role role:roles) {
            list.add(new SimpleGrantedAuthority("ROLE_"+role.getRoleName()));
        }

        return list;
    }

}

六.退出操作

  • 在security配置文件中設置退出標籤
<!-- 退出 -->
        <security:logout invalidate-session="true" logout-url="/logout.do" logout-success-url="/login.jsp" />

logout-url:退出需要請求的鏈接

logout-success-url:註冊成功跳轉的頁面。

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章