日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

Shiro 整合 SpringBoot

發(fā)布時(shí)間:2025/3/11 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Shiro 整合 SpringBoot 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Shiro 整合 SpringBoot

shiro主要有三大功能模塊

  • Subject:主體,一般指用戶。

  • SecurityManager:安全管理器,管理所有Subject,可以配合內(nèi)部安全組件。(類(lèi)似于SpringMVC中的DispatcherServlet)

  • Realms:用于進(jìn)行權(quán)限信息的驗(yàn)證,一般需要自己實(shí)現(xiàn)。

  • shiro架構(gòu)圖

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-PkoyMhpN-1610439982383)(C:\Users\鄭大人\AppData\Roaming\Typora\typora-user-images\image-20200629142750768.png)]

    Subject 用戶 SecurityManager 管理所有用戶 Realm 連接數(shù)據(jù)

    Shiro入門(mén)

    Shiro 配置

    按步驟:

  • 先創(chuàng)建一個(gè) Realms 類(lèi) 繼承自 AuthorizingRealm 類(lèi) 實(shí)現(xiàn)它兩個(gè)方法 授權(quán) doGetAuthorizationInfo 和 認(rèn)證 doGetAuthenticationInfo

    import com.entity.User; import com.service.impl.UserServiceImpl; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.*; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.authz.SimpleAuthorizationInfo; import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.subject.PrincipalCollection; import org.apache.shiro.subject.Subject; import org.springframework.beans.factory.annotation.Autowired;//自定義的UserRealm public class UserRealm extends AuthorizingRealm {@AutowiredUserServiceImpl userService;//授權(quán)@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {System.out.println("執(zhí)行了==> 授權(quán)");// 創(chuàng)建 簡(jiǎn)單授權(quán)信息類(lèi)final SimpleAuthorizationInfo authorizationInfo= new SimpleAuthorizationInfo();//獲得當(dāng)前的用戶 當(dāng)前的用戶首先得被存入 簡(jiǎn)單身份驗(yàn)證信息類(lèi) 構(gòu)造函數(shù)的第一個(gè)參數(shù)中final Subject subject = SecurityUtils.getSubject();User currentUser = (User)subject.getPrincipal();//添加當(dāng)前用戶 字符串權(quán)限authorizationInfo.addStringPermission(currentUser.getPerms());return authorizationInfo;}//認(rèn)證@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {System.out.println("執(zhí)行了==> 認(rèn)證 ");UsernamePasswordToken token = (UsernamePasswordToken)authenticationToken;// 用戶名,密碼 從數(shù)據(jù)庫(kù)中取User user = userService.qureyUserByName(token.getUsername());if(user == null){return null; //拋出異常 UnknownAccountException 未知賬戶異常}//密碼認(rèn)證 由 shiro 來(lái)完成,加密了//返回 簡(jiǎn)單身份驗(yàn)證信息類(lèi)return new SimpleAuthenticationInfo(user,user.getPassword(),"");} }
  • 創(chuàng)建一個(gè)Shiro的配置類(lèi),里面向spring容器注入三個(gè)Bean 分別是:

  • ShiroFilterFactoryBean: 用來(lái)設(shè)置 過(guò)濾器,以及權(quán)限,登錄頁(yè),未授權(quán)跳轉(zhuǎn)頁(yè)等等.(需要給方法傳入安全管理器 DefaultWebSecurityManager對(duì)象)
  • DefaultWebSecurityManager: DefaultWebSecurityManager類(lèi)主要定義了設(shè)置subjectDao,獲取會(huì)話模式,設(shè)置會(huì)話模式,設(shè)置會(huì)話管理器,是否是http會(huì)話模式等操作,它繼承了DefaultSecurityManager類(lèi),實(shí)現(xiàn)了WebSecurityManager接口。
  • Realms 自定義的類(lèi)
  • import at.pollux.thymeleaf.shiro.dialect.ShiroDialect; import org.apache.shiro.spring.web.ShiroFilterFactoryBean; import org.apache.shiro.web.mgt.DefaultWebSecurityManager; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map;@Configuration public class ShiroConfig {//ShiroFilterFactoryBean :3@Beanpublic ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("SecurityManager")DefaultWebSecurityManager defaultWebSecurityManager){final ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();// 設(shè)置安全管理器bean.setSecurityManager(defaultWebSecurityManager);//添加shiro的內(nèi)置過(guò)濾器 攔截/*** anon:無(wú)需認(rèn)證即可訪問(wèn)* authc:必須認(rèn)證才可以訪問(wèn)* user:必須擁有記住我 功能才可以用* perms:擁有對(duì)某個(gè)資源的權(quán)限才能訪問(wèn)* role:擁有某個(gè)角色權(quán)限才能訪問(wèn)*///攔截Map<String,String> filterMap = new LinkedHashMap<>();filterMap.put("/add","authc"); //也可支持通配符 *filterMap.put("/update","authc");//授權(quán) perms[a:b] 必須是a ,且有權(quán)限bfilterMap.put("/add","perms[user:add]");filterMap.put("/update","perms[user:update]");//設(shè)置過(guò)濾器鏈定義圖bean.setFilterChainDefinitionMap(filterMap);//設(shè)置登錄頁(yè)面,即如果沒(méi)有權(quán)限,就會(huì)跳轉(zhuǎn)至登錄頁(yè)面bean.setLoginUrl("/toLogin");//設(shè)置未授權(quán)跳轉(zhuǎn)頁(yè)面的urlbean.setUnauthorizedUrl("/unauthorized");return bean;}//DefaultWebSecurityManager:2@Bean(name = "SecurityManager")public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){final DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();//關(guān)聯(lián) UserRealmdefaultWebSecurityManager.setRealm(userRealm);return defaultWebSecurityManager;}//創(chuàng)建 realm 對(duì)象 ,需要自定義 :1@Bean(name = "userRealm")public UserRealm getRealm(){return new UserRealm();}}

    登錄

    @RequestMapping("/login")public String login(@RequestParam(name = "username") String username,@RequestParam(name = "password") String password,Model model){//獲取當(dāng)前用戶final Subject subject = SecurityUtils.getSubject();//封裝用戶的登錄數(shù)據(jù)final UsernamePasswordToken token = new UsernamePasswordToken(username, password);try {//執(zhí)行登錄的方法 ,如果沒(méi)有異常就ok了//執(zhí)行登錄時(shí),會(huì)進(jìn)入Realm中認(rèn)證subject.login(token);return "index";} catch (AuthenticationException e) {model.addAttribute("msg","用戶名或密碼錯(cuò)誤!");return "login";}}

    注銷(xiāo)

    /*** 退出用戶* @return*/@RequestMapping("/logout")public String logout(){final Subject subject = SecurityUtils.getSubject();//退出用戶subject.logout();return "index";}

    Shiro整合 Thymeleaf

    依賴

    <!-- https://mvnrepository.com/artifact/com.github.theborakompanioni/thymeleaf-extras-shiro --> <dependency><groupId>com.github.theborakompanioni</groupId><artifactId>thymeleaf-extras-shiro</artifactId><version>2.0.0</version> </dependency>

    整合配置

    Shiro整合 Thymeleaf 需要在配置類(lèi)中加入一個(gè)Bean 到 spring容器,這個(gè)類(lèi)是 ShiroDialect

    @Configuration public class ShiroConfig {//用來(lái)整合 thymeleaf@Beanpublic ShiroDialect getShiroDialect(){return new ShiroDialect();}//ShiroFilterFactoryBean :3@Beanpublic ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("SecurityManager")DefaultWebSecurityManager defaultWebSecurityManager){final ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();// 設(shè)置安全管理器bean.setSecurityManager(defaultWebSecurityManager);//添加shiro的內(nèi)置過(guò)濾器 攔截/*** anon:無(wú)需認(rèn)證即可訪問(wèn)* authc:必須認(rèn)證才可以訪問(wèn)* user:必須擁有記住我 功能才可以用* perms:擁有對(duì)某個(gè)資源的權(quán)限才能訪問(wèn)* role:擁有某個(gè)角色權(quán)限才能訪問(wèn)*///攔截Map<String,String> filterMap = new LinkedHashMap<>();filterMap.put("/add","authc"); //也可支持通配符 *filterMap.put("/update","authc");//授權(quán) perms[a:b] 必須是a ,且有權(quán)限bfilterMap.put("/add","perms[user:add]");filterMap.put("/update","perms[user:update]");//設(shè)置過(guò)濾器鏈定義圖bean.setFilterChainDefinitionMap(filterMap);//設(shè)置登錄頁(yè)面,即如果沒(méi)有權(quán)限,就會(huì)跳轉(zhuǎn)至登錄頁(yè)面bean.setLoginUrl("/toLogin");//設(shè)置未授權(quán)跳轉(zhuǎn)頁(yè)面的urlbean.setUnauthorizedUrl("/unauthorized");return bean;}//DefaultWebSecurityManager:2@Bean(name = "SecurityManager")public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){final DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();//關(guān)聯(lián) UserRealmdefaultWebSecurityManager.setRealm(userRealm);return defaultWebSecurityManager;}//創(chuàng)建 realm 對(duì)象 ,需要自定義 :1@Bean(name = "userRealm")public UserRealm getRealm(){return new UserRealm();}}

    html

    <!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.thymeleaf.org/thymeleaf-extras-shiro"> <!-- shiro 整合 thymeleaf 的提示--> <head><meta charset="UTF-8"><title>首頁(yè)</title> </head> <body> <h1>首頁(yè)</h1> <p><a href="/toLogin">登錄</a></p> <p><a href="/logout">退出</a></p> <hr><div shiro:hasPermission="user:add"> <!--判斷權(quán)限--><a th:href="@{/add}">add</a> </div> <div shiro:hasPermission="user:update"><a th:href="@{/update}">update</a> </div></body> </html>

    總結(jié)

    以上是生活随笔為你收集整理的Shiro 整合 SpringBoot的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。