springSecurity自定義認證配置
阿新 • • 發佈:2018-06-02
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自定義認證配置