Shiro過濾器&標簽簡介
判斷 sesion中是否有 user 判斷賬戶密碼是否正確
- (1)分析
需要過濾器控制 沒有權限下訪問鏈接
需要標簽控制 沒有權限下 界面元素的隱藏
》anon代表不認證也可以訪問,通常對靜態資源進行放行
》authc代表必須通過認證才可以訪問,通常對動態資源(controller,jsp頁面)進行攔截,如果用戶沒有認證,Shiro會自動跳轉到login.jsp頁面
Shiro登陸認證-判斷session中的user
- (1)過濾器
在專案中使用認證過濾器攔截資源(該攔截的攔截,該放行的放行) - (2)authc認證過濾器
必須認證才能訪問,如果未認證跳登錄頁 - (3)anon過濾器
放行,不需要攔截認證 - (4)攔截路徑問題
/*
/**
applicationContext-shiro.xml
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<!--注入SecurityManager-->
<property name="securityManager" ref="securityManager"/>
<property name="filterChainDefinitions">
<value>
<!-- 如果請求提靜態資源 anon 不要求session中有user,直接可以訪問-->
/css/**=anon
/img/**=anon
/plugins/**=anon
<!-- 如果請求login.do方法 anon-->
/system/user/login-shiro.do=anon
<!-- 如果除以上之后的xxx.do 要求登錄 authc查詢session中是否有user-->
/**=authc
</value>
</property>
<!--如果 session就是沒有user,表示未登錄,頁面轉到login-shiro.jsp -->
<property name="loginUrl" value="/login-shiro.jsp"/>
</bean>

Shiro登錄認證-用戶密碼判斷
Shiro登陸認證三種結果
- (1)正確
無例外
User user = (User)subject.getPrincipal()//獲取user物件 - (2)用戶不存在
程式拋出UnknownAccountException例外 - (3)用戶密碼出錯
程式拋出IncorrectCredentialsException例外
Shiro登陸認證login方法
- (1) 獲取Subject物件
Subject subject = SecurityUtils.getSubject(); - (2)呼叫Subject的認證方法 : login 本質:AuthRealm的認證方法
subject.login(token); - (3)登錄的結果
正確
用戶不存在
用戶密碼出錯
UserController
userController通地subject連接到securitymanager,再由securityManager去呼叫realm
//${path}/system/user/login-shiro.do
@RequestMapping(path = "/login-shiro", method = {RequestMethod.GET, RequestMethod.POST})
public String loginShiro(String email,String password) {
//根據 email查詢對應的用戶
l.info("loginShiro email " + email);
l.info("loginShiro password " + password);
//使用shiro框架進行認證 結果也是三種可能 正確 沒有例外,用戶不存在 UnknownAccountException,密碼出錯 IncorrectCredentialsException
//本質是需要呼叫realm進行查找用戶
Subject subject = SecurityUtils.getSubject();//獲取連接
//1:先獲取subject 表示對securitymanager連接
//2:呼叫 securitymanager
//3:再呼叫realm
//難驗資訊
UsernamePasswordToken token = new UsernamePasswordToken(email, password);//身份驗證
try {
subject.login(token);//正確 --realm
//正確
l.info("正確");
//保存用戶資訊
//要求訪問realm回傳一個user物件
User user = (User) subject.getPrincipal();// --realm
session.setAttribute("loginUser",user);
//一個 Module物件 就是左側欄上的一個選單項
List<Module> menus = iModuleService.findModulesByUser(user);
session.setAttribute("menus",menus);
l.info("login menus "+menus);
//跳到主頁
return "redirect:/home/toMain.do";
} catch (UnknownAccountException e) {//用戶不存在
e.printStackTrace();
l.info("用戶不存在");
request.setAttribute("error","用戶不存在");
return "forward:/login-shiro.jsp";
}catch (IncorrectCredentialsException e){//密碼出錯
e.printStackTrace();
l.info("密碼不對");
request.setAttribute("error","郵箱或者密碼不對");
return "forward:/login-shiro.jsp";
}
}
AuthRealm
//認證(登錄賬號密碼)
//subject.login(token);
//參1 接受 subject.login(token); 方法的值 authenticationToken
@Autowired
IUserService userService;
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
l.info("AuthRealm doGetAuthenticationInfo 函式執行了");
//回應login方法和getPrincipal方法的呼叫
UsernamePasswordToken usernamePasswordToken= (UsernamePasswordToken) token;
String email = usernamePasswordToken.getUsername();
l.info("doGetAuthenticationInfo --"+email);
//調service讀dao
User user = userService.findUserByEmail(email);
l.info("doGetAuthenticationInfo --"+user);
if (user == null) {
//用戶不存在
return null;//-->系統會將null轉成UnknownAccountException拋出
} else {
//用戶存在的
//AuthenticationInfo 回傳給 User user = (User) subject.getPrincipal();
/**
* 引數一:principal,存放用戶登錄資訊,subject.getPrincipal()獲取
* 引數二:資料庫的密碼
* 引數三:realm的別名,只有在多個Realm的時候才會用,一般不用
*/
AuthenticationInfo info = new SimpleAuthenticationInfo(user, user.getPassword(), "");
return info;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/209116.html
標籤:其他
上一篇:if陳述句為什么不一樣了
下一篇:CISP-PTE
