Day04-Spring Security框架入門——商家登錄

5.商家系統登錄與安全控制

5.1需求分析

完成商家系統登陸與安全控制,商家賬號來自數據庫,並實現密碼加密

5.2自定義認證類

  1. pom.xml、web.xml  、login.html  參照運營商管理後臺
  2. 在pinyougou-shop-web創建com.pinyougou.service包,包下創建類UserDetailsServiceImpl.java 實現UserDetailsService接口
  3. 認證類調用服務方法

    修改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;
        }
    }
    
  4. 在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>

    經過上述修改後,在登陸頁輸入用戶名和密碼與數據庫一致即可登陸 。

 

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