上篇文章實作類基于Shiro的認證操作,本文來實作下授權操作。
授權
Shiro授權原理及細節内容歡迎參考如下連結
https://dpb-bobokaoya-sm.blog.csdn.net/article/details/866524181.擷取使用者對應的權限
本項目中我們的權限就隻涉及到角色,沒有再細粒度到菜單,感興趣的可以自己可擴充實作下。
IUserService方法
/**
* 根據使用者編号擷取對應的權限資訊
* @param userId
* @return
*/
public List<Role> queryRoleByUserId(int userId);
UserServiceImpl實作
@Override
public List<Role> queryRoleByUserId(int userId) {
return roleMapper.queryRoleByUserId(userId);
}
RoleMapper接口中定義方法
List<Role> queryRoleByUserId(int userId);
RoleMapper映射檔案中添加sql
<select id="queryRoleByUserId" resultMap="BaseResultMap">
select *
from t_role t1
where t1.role_id in (
select role_id from t_user_role where user_id = #{id}
)
</select>
2.授權方法
修改MyRealm中授權的方法
/**
* 授權的方法
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
// 擷取認證的資訊
User user = (User) principals.getPrimaryPrincipal();
// 擷取登入使用者對應的權限
List<Role> roles = userService.queryRoleByUserId(user.getUserId());
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
for (Role role : roles) {
// 将使用者具有的角色儲存到SimpleAuthorizationInfo對象中
info.addRole(role.getRoleName());
}
return info;
}
3.SpringMVC添加配置
<!-- 開啟Shiro注解 -->
<aop:config proxy-target-class="true"></aop:config>
<bean
class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
<property name="securityManager" ref="securityManager" />
</bean>
4.資料準備
建立一個賬号配置設定對應的角色用來測試。
5.限制權限
// 目前登入使用者需要"管理者角色才能通路"
@RequiresRoles("管理者")
@RequestMapping("/queryPage")
public String queryPage(UserDto dto,Model model){
PageInfo<User> pageModel = userService.queryPage(dto);
model.addAttribute("pageModel", pageModel);
return "user/user";
}
用沒有"管理者"角色的通路測試
用具有通路權限的賬号登入
有權的通路成功。
解決沒有通路權限的跳轉問題。
建立一個沒有權限的跳轉頁面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>無标題文檔</title>
<link href="css/style.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="js/jquery.js"></script>
<script language="javascript">
$(function() {
$('.error').css({
'position' : 'absolute',
'left' : ($(window).width() - 490) / 2
});
$(window).resize(function() {
$('.error').css({
'position' : 'absolute',
'left' : ($(window).width() - 490) / 2
});
})
});
</script>
</head>
<body style="background: #edf6fa;">
<div class="place">
<span>位置:</span>
<ul class="placeul">
<li><a href="#">首頁</a></li>
<li><a href="#">沒有通路權限提示</a></li>
</ul>
</div>
<div class="error">
<h2>非常遺憾,您沒有權限通路該頁面!</h2>
<p>看到這個提示,就自認倒黴吧!</p>
<div class="reindex">
<a href="/main" target="_parent">傳回首頁</a>
</div>
</div>
<div style="display: none">
<script src='http://v7.cnzz.com/stat.php?id=155540&web_id=155540'
language='JavaScript' charset='gb2312'></script>
</div>
</body>
</html>
SpringMVC中配置
<!-- shiro為內建springMvc 攔截異常 -->
<bean
class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props> <!-- 這裡你可以根據需要定義N多個錯誤異常轉發 -->
<prop key="org.apache.shiro.authz.UnauthorizedException">redirect:/failed</prop>
<prop key="org.apache.shiro.authz.UnauthenticatedException">redirect:/login.jsp</prop>
<!--<prop key="java.lang.IllegalArgumentException">redirect:/error.jsp</prop>
參數錯誤(bizError.jsp) -->
<!--<prop key="java.lang.Exception">redirect:/error.jsp</prop> 其他錯誤為'未定義錯誤'(unknowError.jsp) -->
</props>
</property>
</bean>
用沒有權限的賬号測試
權限标簽在具體的業務場景中使用~