SpringBoot與Shiro整合-許可權管理實戰視訊筆記(之三)
阿新 • • 發佈:2019-01-05
本文內容大部分來自黑馬視訊的SpringBoot與Shiro整合-許可權管理實戰視訊,在此記錄為個人學習筆記。
可按步驟操作,無法實操的實戰blog都是耍流氓。
七、Shiro授權-使用Shiro過濾器實現授權頁面攔截
1. 在ShiroConfig中新增過濾器
//授權過濾器:授權攔截後,shiro會自動跳轉到未授權頁面
filterMap.put("/add", "perms[user:add]");
filterMap.put("/*", "authc");
Tips:注意要寫在/*之前,否則不會攔截
2. 新增設定未授權頁面
(1)ShiroConfig中
//修改自動跳轉的未授權頁面
shiroFilterFactoryBean.setUnauthorizedUrl("/unAuth");
(2)UserController中
@RequestMapping("/unAuth")
public String unAuth() {
return "unAuth";
}
(3)新增unAuth.html
3. 測試
登入認證之後,訪問/add頁面會提示未授權,而/update可以正常訪問。
八、Shiro授權-編寫資源授權邏輯
剛才列印的log日誌中可以看到,只要訪問了需要授權訪問的資源,就會執行UserRealm中的doGetAuthenticationInfo()方法,在該方法中給資源進行授權。
/**
* 執行授權邏輯
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) {
System.out.println("執行授權邏輯");
//給資源進行授權
SimpleAuthorizationInfo info=new SimpleAuthorizationInfo();
//新增資源的授權字串
info.addStringPermission("user:add" );
return info;
}
測試檢視效果:日誌中可以看到執行了該授權邏輯,現在可以訪問/add了
九、Shiro授權-關聯資料庫動態授權
1. 修改資料表
給user表新增perms欄位,插入兩個測試使用者
2. 一系列小修改
(1)User.java:新增perms屬性和getter/setter
(2)UserMapper.java:
public User findById(Integer id);
(3)UserMapper.xml
<select id="findById" parameterType="int" resultType="User" >
select id,username,password,perms from user where id = #{value}
</select>
(4)UserService.java
public User findById(Integer id);
(5)UserServiceImpl.java
@Override
public User findById(Integer id) {
return userMapper.findById(id);
}
(6)給/update新增資源攔截
filterMap.put("/update", "perms[user:update]");
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) {
System.out.println("執行授權邏輯");
//給資源進行授權
SimpleAuthorizationInfo info=new SimpleAuthorizationInfo();
/*//新增資源的授權字串
info.addStringPermission("user:add");*/
//獲取當前使用者
Subject subject=SecurityUtils.getSubject();
User user=(User)subject.getPrincipal();
//到資料庫查詢當前登入使用者的授權字串
User dbUser=userService.findById(user.getId());//通過當前登入使用者id查詢的資料庫使用者
info.addStringPermission(dbUser.getPerms());
return info;
}
將doGetAuthenticationInfo()方法的返回修改為
return new SimpleAuthenticationInfo(user,user.getPassword(),"");
因為User user=(User)subject.getPrincipal();
所取得的當前登入使用者就是從這裡來的
4. 登入不同許可權使用者進行測試
各自有了各自的許可權。
十、ThymeLeaf和shiro標籤整合使用
1. 匯入thymeleaf對shiro的擴充套件座標
<!-- 匯入thymeleaf對shiro的擴充套件座標 -->
<dependency>
<groupId>com.github.theborakompanioni</groupId>
<artifactId>thymeleaf-extras-shiro</artifactId>
<version>2.0.0</version>
</dependency>
2. 配置ShiroDialect
@Bean
public ShiroDialect getShiroDialect(){
return new ShiroDialect();
}
3. 在頁面上使用shiro標籤
<div shiro:hasPermission="user:add">
進入使用者新增頁面:<a href="add">使用者新增</a>
</div>
<div shiro:hasPermission="user:update">
進入使用者更新頁面:<a href="update">使用者更新</a>
</div>
4. 執行測試
不同許可權使用者登入,只顯示了他有許可權看到的內容。