1. 程式人生 > >springSecurity自定義認證配置

springSecurity自定義認證配置

pojo property ood 目錄 spring註解 web tex poj uri

上一篇講了springSecurity的簡單入門的小demo,認證用戶是在xml中寫死的。今天來說一下自定義認證,讀取數據庫來實現認證。當然,也是非常簡單的,因為僅僅是讀取數據庫,權限是寫死的,因為相對簡單,沒幾個角色,就直接寫死了。

還有就是加密,使用的是框架自帶的 BCryptPasswordEncoder 加密方法。存在數據庫的用戶密碼也是通過這個類加密,然後登陸的時候也是通過這個類驗證,需要在xml中配置下就ok。

簡單說一下這個加密類。比md5更加的高級。

加密分為 :

可逆(秘鑰)

不可逆(哈希算法)(BCryptPasswordEncoder 和md5 都屬於 )

理論上md5是不可逆的,但是其實上是可以破解的,如果不想被破解,可以采用加鹽的方法,BCryptPasswordEncoder就是自己生成隨機鹽,即使密碼一樣得到的加密後的密碼也不一樣,這大大增加了破解的難度。

大體步驟:

自己寫一個類實現 UserDetailsService 這個接口 ,實現一個方法,最主要是返回一個User對象,這個對象是框架提供的。具體看代碼。

然後將這個自定義的類在xml中配置一下,就是說原來寫死的用戶信息刪除掉,采用這個類來驗證。 就ok 非常簡單

UserDetailsServiceImpl.java    // 認證類

package com.pinyougou.service;

import com.pinyougou.pojo.TbSeller; import com.pinyougou.sellergoods.service.SellerService; import org.springframework.security.core.GrantedAuthority; 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.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import java.util.ArrayList; import java.util.List; /** * 認證類 * @author Administrator * */ public class UserDetailsServiceImpl implements UserDetailsService { private SellerService sellerService; public void setSellerService(SellerService sellerService) { this.sellerService = sellerService; } @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { System.out.println("經過了UserDetailsServiceImpl"); //構建角色列表 List<GrantedAuthority> grantAuths=new ArrayList(); grantAuths.add(new SimpleGrantedAuthority("ROLE_SELLER")); //得到商家對象 TbSeller seller = sellerService.findOne(username); if(seller!=null){ if(seller.getStatus().equals("1")){ return new User(username,seller.getPassword(),grantAuths); }else{ return null; } }else{ return null; } } }

spring-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:dubbo="http://code.alibabatech.com/schema/dubbo"
    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://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
                        http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd">
   
    <!-- 設置頁面不登陸也可以訪問 -->
    <http pattern="/*.html" security="none"></http>
    <http pattern="/css/**" security="none"></http>
    <http pattern="/img/**" security="none"></http>
    <http pattern="/js/**" security="none"></http>
    <http pattern="/plugins/**" security="none"></http>
    <http pattern="/seller/add.do" security="none"></http>

    <!-- 頁面的攔截規則    use-expressions:是否啟動SPEL表達式 默認是true -->
    <http use-expressions="false">
        <!-- 當前用戶必須有ROLE_USER的角色 才可以訪問根目錄及所屬子目錄的資源 -->
        <intercept-url pattern="/**" access="ROLE_SELLER"/>
        <!-- 開啟表單登陸功能 -->
        <form-login  login-page="/shoplogin.html" default-target-url="/admin/index.html" authentication-failure-url="/shoplogin.html" always-use-default-target="true"/>
        <csrf disabled="true"/>
        <headers>
            <frame-options policy="SAMEORIGIN"/>
        </headers>
        <logout/>
    </http>
    
    <!-- 認證管理器 -->
    <authentication-manager>
        <authentication-provider user-service-ref="userDetailService">
            <password-encoder ref="bcryptEncoder"></password-encoder>
        </authentication-provider>    
    </authentication-manager>
        
    <!-- 自定義認證類 -->
    <beans:bean id="userDetailService" class="com.pinyougou.service.UserDetailsServiceImpl">
        <beans:property name="sellerService" ref="sellerService"></beans:property>
    </beans:bean>
    
    <!-- 引用dubbo 服務 因為認證類需要用到這個服務,但是這個服務是在dubbo中的,遠程的,所以需要采用這種方法來引入,不能
     在向以前那樣直接spring註解的方法引入了,切記。-->
    <dubbo:application name="pinyougou-shop-web" />
    <dubbo:registry address="zookeeper://47.98.157.114:2181"/>
    <dubbo:reference id="sellerService" interface="com.pinyougou.sellergoods.service.SellerService"></dubbo:reference>

    <!--加密類-->
    <beans:bean id="bcryptEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"></beans:bean>
</beans:beans>









springSecurity自定義認證配置