在家無聊復習一下shiro
打開了之前的項目,由於lombok插件安裝不了,不知道idea抽什么風所以get,set方法報錯了,將就一下
只看shiro的使用,配置在shiro分類中有
登錄方法
package com.zys.sys.controller; import com.zys.sys.common.ActiverUser; import com.zys.sys.common.ResultObj; import com.zys.sys.common.WebUtils; import com.zys.sys.domain.Loginfo; import com.zys.sys.service.LoginfoService; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.AuthenticationToken; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.subject.Subject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.Date; @RestController @RequestMapping("login") public class LoginController { @Autowired LoginfoService loginfoService; @RequestMapping("login") public ResultObj login(String loginname, String pwd){
//創建Subject對象 Subject subject = SecurityUtils.getSubject();
//先把賬號密碼傳入Shiro里面的UsernamePasswordToken對象里面。 AuthenticationToken token = new UsernamePasswordToken(loginname,pwd);
try{
//調用安全管理器,安全管理器調用自定義Realm 此時先執行i定義realm subject.login(token);
//登陸成功后就可以通過安全管理器獲得用戶對象。 ActiverUser activerUser=(ActiverUser) subject.getPrincipal(); System.out.println(activerUser.toString()); WebUtils.getSession().setAttribute("user",activerUser.getUser()); //記錄登錄日志,插入登錄表 System.out.println(WebUtils.getRequest().getRemoteAddr()); Loginfo loginfo = new Loginfo(); loginfo.setLoginname(activerUser.getUser().getName()+"-"+activerUser.getUser().getLoginname()); loginfo.setLoginip(WebUtils.getRequest().getRemoteAddr()); loginfo.setLogintime(new Date()); this.loginfoService.save(loginfo); return ResultObj.LOGIN_SUCCESS; }catch (AuthenticationException e){ return ResultObj.LOGIN_ERROR; } } }
自定義realm
package com.zys.sys.UserRealm; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.zys.sys.common.ActiverUser; import com.zys.sys.domain.User; import com.zys.sys.service.UserService; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.AuthenticationInfo; import org.apache.shiro.authc.AuthenticationToken; import org.apache.shiro.authc.SimpleAuthenticationInfo; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.subject.PrincipalCollection; import org.apache.shiro.util.ByteSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; public class UserRealm extends AuthorizingRealm { @Autowired @Lazy UserService userService; @Override public String getName() { return this.getClass().getName(); } @Override //認證方法 protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { return null; } @Override //授權方法 protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { QueryWrapper<User> querywapper = new QueryWrapper<>(); System.out.println(token.getCredentials()+"mmmmmmmmmmmmmmmmmmmmmmmmmmmm"); System.out.println(token.getPrincipal()+"mmmmmmmmmmmmmmmmmmmmmmmmmmmm"); querywapper.eq("loginname",token.getPrincipal().toString()); User user = userService.getOne(querywapper); if(null != user){ ActiverUser auser = new ActiverUser(); auser.setUser(user); ByteSource bs = ByteSource.Util.bytes(user.getSalt()); // System.out.println(bs+"----------------------------------"); SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(auser,user.getPwd(),bs,this.getName()); return info; } return null; } }
1.doGetAuthorizationInfo方法
該方法主要是用於當前登錄用戶授權(作者小白插一句:我實現該方法時只是進行了當前登錄用戶的角色與權限初始化,至於授權判斷估計shiro幫我們做了)
1.調用SecurityUtils.getSubject().isPermitted(String str)方法時會調用doGetAuthorizationInfo方法,SecurityUtils.getSubject().isPermitted(String str)方法返回的是boolean值所以開發者得自定義業務邏輯。
2.在配置文件中配置有類似/**=roles["user"]或者/**=perms[“user”](/**路徑是開發者自行定義)的配置的時候會調用doGetAuthorizationInfo方法,這個時候有兩種情況:
一、 當當前沒有用戶登錄時shiro會幫我們跳轉到login.jsp(默認會找根目錄下的login.jsp)
二、當前有登錄用戶時shiro會自動判定當前登錄用戶的角色或者權限符合訪問當前訪問路徑,如果不符合那么將跳轉到開
發者所配置的未授權提示頁面( <property name="unauthorizedUrl" value="/unauthorized.jsp"/>),這種調用情
下doGetAuthorizationInfo方法只會被調用一次,除非更換了當前登錄用戶。
2.doGetAuthenticationInfo方法
該方法是進行用戶驗證的
1.調用currUser.login(token)方法時會調用doGetAuthenticationInfo方法,作者小白重寫該方法的主要內容是根據提交的用戶名與密碼到數據庫進行匹配,如果匹配到了就返回一個AuthenticationInfo對象否則返回null,同樣shiro會幫我們進行判斷當返回null的時候會拋出一個異常,開發者可根據該異常進行相應的邏輯處理