1. 程式人生 > >SpringBoot與Shiro整合-許可權管理實戰視訊筆記(之三)

SpringBoot與Shiro整合-許可權管理實戰視訊筆記(之三)

本文內容大部分來自黑馬視訊的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. 執行測試

不同許可權使用者登入,只顯示了他有許可權看到的內容。