Spring與Shiro整合 登錄操做

Spring與Shiro整合 登錄操做

做者 : Stanley 羅昊前端

【轉載請註明出處和署名,謝謝!】數據庫

編寫登錄Controller方法

 

 

 講解:app

首先,若是你登錄失敗的時候,它會把你的異常信息丟到一個叫shirologinFailure這個值裏面,這個值對應上咱們的請求做用域中,它的key值就是shirologinFailure;jsp

咱們從中能夠獲取到異常的名稱(異常錯誤信息)咱們用string來接收異常信息exceptionClassName,而後咱們就能夠開始判斷,若是exceptionClassName !=null的時候,那就代表登錄失敗了,登錄失敗以後,咱們就直接return 「forward/login.jsp」;就直接給他跳轉到登錄頁面,讓用戶繼續登錄;spa

那咱們登錄成功呢?注意看下方註解:code

該方法不處理登錄成功的狀況,會自動幫咱們跳轉到上一個操做路徑,因此登錄失敗了就會進入到這個方法中返回一個登錄頁面,若是成功,壓根就不會進入這個方法,而是直接跳轉到咱們以前所保留的那個登錄路徑;xml

登錄操做

當咱們嘗試登錄的時候,咱們就會發現沒法登錄,返回的內容倒是用戶名不存在;對象

由於,當咱們登錄的時候,shiro會首先經過咱們自定義的Realm進行操做【也就是咱們編寫的UserRealm類】,咱們在下方能夠看到//認證操做,該方法返回的結果是null,null的意思就是找不到用戶信息,好比咱們剛纔在文本框輸入用戶名:zhangsan,這個時候咱們查詢不出來,就從該認證器中返回一個null告訴用戶,找不到;blog

 

 

 

 因此,咱們接下來須要把認證器補充完整;token

咱們能夠看到該方法有一個參數token,沒錯,咱們就是要經過這個token來獲取咱們前端用戶傳過來的用戶名(UserName),而後去咱們數據庫中進行查詢對比;對比下你是否擁有這個用戶,若是有的話,我就直接把它返回就能夠了;

接下來,咱們就須要從token中獲取登錄的用戶名(用戶填寫的文本框中的值),查詢數據庫返回用戶信息;那咱們要怎樣獲取用戶Name呢》其實很是簡單:

String username = (String) token.getPrincipal();//用來獲取用戶名

接下來,咱們拿到這個用戶名後,咱們就能夠進行dao【Mybiats就是Mapper來完成操做】的JDBC操做了,由於咱們用的是Spring環境,咱們就能夠經過依賴注入的方式來進行操做,咱們直接將登錄的接口注入進來,將獲取到的用戶名直接丟進去便可;具體步驟:

1.咱們在Dao【Mapper層】中找到User這個接口層而且編寫接口:User getUserByUsername(String username);//獲取用戶對象,經過用戶名查詢獲取;

2.在Service層重寫Mapper結構並編寫實現類impl,直接調Mapper層中的登錄接口,直接retrun方法;

 @Autowired
        private UserMapper userMapper;

        public User getUserByUsername(String username){
            return userMapper.getUserByUsername(username);
        }

2.Sql語句:Select * From user(表名) where username = ?;查詢返回咱們的User對象【Mybiats在.xml文件中編寫Sql】;

3.使用依賴注入,將Service注入到受權器中;

        String username = (String) token.getPrincipal();//用來獲取用戶名
        User user = userService.getUserByUsername(username);

4.判斷

if (ObjectUtils.isEmpty(user){
            //若是用戶名不存在,直接返回null便可
            return null;
        }else{
            //若是該用戶存在
            /**
             * 1.用戶對象
             * 2.用戶對應的密碼,將數據庫密碼返回,Shiro會自動判斷
             * 3.上方定義的Realm名字(當前自定義Realm的名稱)
             */
           return new SimpleAuthenticationInfo(user,user.getpassword,getName);
        }
相關文章
相關標籤/搜索