5.商家系統登錄與安全控制
5.1需求分析
完成商家系統登陸與安全控制,商家賬號來自數據庫,並實現密碼加密
5.2自定義認證類
- pom.xml、web.xml 、login.html 參照運營商管理後臺
- 在pinyougou-shop-web創建com.pinyougou.service包,包下創建類UserDetailsServiceImpl.java 實現UserDetailsService接口
-
認證類調用服務方法
修改UserDetailsServiceImpl.java ,添加屬性和setter方法 ,修改loadUserByUsername方法
package com.pinyougou.shop.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; /** * @Auther: jun * @Date: 2018/8/21 0021 09:23 * @Description: 認證類實現 */ public class UserDetailsServiceImpl implements UserDetailsService { private SellerService sellerService; public void setSellerService(SellerService sellerService) { this.sellerService = sellerService; } @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { //構建角色列表 List<GrantedAuthority> granthAuths = new ArrayList<> (); granthAuths.add (new SimpleGrantedAuthority ("ROLE_SELLER")); //查詢通過id也就是username查詢商家 TbSeller seller = sellerService.findOne (username); //判斷商家是否存在 if (seller!=null){//存在 //判斷商家狀態是否是審覈通過的 if (seller.getStatus ().equals ("1")){ //是 返回用戶 return new User (username,seller.getPassword (),granthAuths); }else { return null; } } return null; } }
- 在pinyougou-shop-web的spring目錄下創建spring-security.xml
<!-- 以下頁面不被攔截 --> <!--不攔截根目錄下的html文件--> <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--> <!--form-login 爲開啓表單登陸 use-expressions 爲是否使用使用 Spring 表達式語言( SpEL ),默認爲true ,如果開啓,則攔截的配置應該寫成以下形式 <intercept-url pattern="/**" access="hasRole('ROLE_USER')" /> --> <http use-expressions="false"> <!-- 當前用戶必須有ROLE_ADMIN的角色纔可以訪問根目錄及所屬目錄的資源 pattern="/**" 攔截路徑 --> <intercept-url pattern="/**" access="ROLE_SELLER"/> <!-- 開啓表單登錄功能 login-page:登錄頁面 default-target-url:登錄成功後跳轉到主頁 authentication-failure-url:認證失敗跳轉到登錄頁面 login-processing-url="/login" 表單提交的url(默認是spring-security提供了一個url“/login”) username-parameter:可以設置提交的表單name屬性中的用戶名域值默認是 username password-parameter:可以設置提交的表單的name屬性的密碼域值 password always-use-default-target:總是跳轉到登錄成功後的頁面 --> <form-login login-page="/shoplogin.html" default-target-url="/admin/index.html" authentication-failure-url="/shoplogin.html" always-use-default-target="true"/> <!--CSRF(Cross-site request forgery)跨站請求僞造, 也被稱爲“One Click Attack”或者Session Riding,通常縮寫爲CSRF或者XSRF,是一種對網站的惡意利用。--> <csrf disabled="true"/> <!-- 如果你在系統中使用了框架頁,需要設置框架頁的策略爲SAMEORIGIN --> <headers> <frame-options policy="SAMEORIGIN"/> </headers> <!-- 退出 logout-url:退出地址 logout-success-url:退出後跳轉頁面(默認登錄頁面) --> <logout /> </http> <!--認證管理器--> <authentication-manager> <!--注入認證類--> <authentication-provider user-service-ref="userDatialsService"> <!--解密--> <password-encoder ref="passwordEncoder"/> </authentication-provider> </authentication-manager> <!--認證類--> <beans:bean id="userDatialsService" class="com.pinyougou.shop.service.UserDetailsServiceImpl"> <beans:property name="sellerService" ref="sellerService"></beans:property> </beans:bean> <!-- 引用dubbo 服務 --> <dubbo:application name="pinyougou-shop-web" /> <dubbo:registry address="zookeeper://192.168.25.135:2181"/> <!--到註冊中心去獲取到sellerService--> <dubbo:reference id="sellerService" interface="com.pinyougou.sellergoods.service.SellerService"></dubbo:reference> <!--解密類--> <beans:bean id="passwordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"></beans:bean>
修改pinyougou-shop-web的spring-security.xml ,添加如下配置
<!-- 引用dubbo 服務 -->
<dubbo:application name="pinyougou-shop-web" />
<dubbo:registry address="zookeeper://192.168.25.129:2181"/>
<dubbo:reference id="sellerService" interface="com.pinyougou.sellergoods.service.SellerService" >
</dubbo:reference>
<beans:bean id="userDetailService" class="com.pinyougou.service.UserDetailsServiceImpl">
<beans:property name="sellerService" ref="sellerService"></bean:property>
</beans:bean>
經過上述修改後,在登陸頁輸入用戶名和密碼與數據庫一致即可登陸 。