整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          如何實(shí)現(xiàn)登錄、URL和頁面按鈕的訪問控制

          者:社會(huì)主義接班人cnblogs.com/5ishare/p/10461073.html

          用戶權(quán)限管理一般是對(duì)用戶頁面、按鈕的訪問權(quán)限管理。Shiro框架是一個(gè)強(qiáng)大且易用的Java安全框架,執(zhí)行身份驗(yàn)證、授權(quán)、密碼和會(huì)話管理,對(duì)于Shiro的介紹這里就不多說。本篇博客主要是了解Shiro的基礎(chǔ)使用方法,在權(quán)限管理系統(tǒng)中集成Shiro實(shí)現(xiàn)登錄、url和頁面按鈕的訪問控制。

          一、引入依賴

          使用SpringBoot集成Shiro時(shí),在pom.xml中可以引入shiro-spring-boot-web-starter。由于使用的是thymeleaf框架,thymeleaf與Shiro結(jié)合需要 引入thymeleaf-extras-shiro。

          二、增加Shiro配置

          有哪些url是需要攔截的,哪些是不需要攔截的,登錄頁面、登錄成功頁面的url、自定義的Realm等這些信息需要設(shè)置到Shiro中,所以創(chuàng)建Configuration文件ShiroConfig。

          ShiroDialect這個(gè)bean對(duì)象是在thymeleaf與Shiro結(jié)合,前端html訪問Shiro時(shí)使用。

          三、自定義Realm

          在自定義的Realm中繼承了AuthorizingRealm抽象類,重寫了兩個(gè)方法:doGetAuthorizationInfo和doGetAuthenticationInfo。doGetAuthorizationInfo主要是用來處理權(quán)限配置,doGetAuthenticationInfo主要處理身份認(rèn)證。

          這里在doGetAuthorizationInfo中,將role表的id和permission表的code分別設(shè)置到SimpleAuthorizationInfo對(duì)象中的role和permission中。

          還有一個(gè)地方需要注意:@Component("authorizer"),剛開始我沒設(shè)置,但報(bào)錯(cuò)提示需要一個(gè)authorizer的bean,查看AuthorizingRealm可以發(fā)現(xiàn)它implements了Authorizer,所以在自定義的realm上添加@Component("authorizer")就可以了。

          四、登錄認(rèn)證

          1.登錄頁面

          這里做了一個(gè)非常丑的登錄頁面,主要是自己懶,不想在網(wǎng)上復(fù)制粘貼找登錄頁面了。

          2.處理登錄請(qǐng)求

          在LoginController中通過登錄名、密碼獲取到token實(shí)現(xiàn)登錄。

          五、Controller層訪問控制

          1.首先來數(shù)據(jù)庫的數(shù)據(jù),兩張圖是用戶角色、和角色權(quán)限的數(shù)據(jù)。




          2.設(shè)置權(quán)限

          這里在用戶頁面點(diǎn)擊編輯按鈕時(shí)設(shè)置需要有id=002的角色,在點(diǎn)擊選擇角色按鈕時(shí)需要有code=002的權(quán)限。

          @RequestMapping(value = "/edit",method = RequestMethod.GET)
           @RequiresRoles("002")//權(quán)限管理;
           public String editGet(Model model,@RequestParam(value="id") String id) {
           model.addAttribute("id", id);
           return "/user/edit";
           }
          


          @RequestMapping(value = "/selrole",method = RequestMethod.GET)
           @RequiresPermissions("002")//權(quán)限管理;
           public String selctRole(Model model,@RequestParam("id") String id,@RequestParam("type") Integer type) {
           model.addAttribute("id",id);
           model.addAttribute("type", type);
           return "/user/selrole";
           }
          

          當(dāng)使用用戶001登錄時(shí),點(diǎn)擊編輯,彈出框如下,提示沒有002的角色

          點(diǎn)擊選擇角色按鈕時(shí)提示沒有002的權(quán)限。

          當(dāng)使用用戶002登錄時(shí),點(diǎn)擊編輯按鈕,顯示正常,點(diǎn)擊選擇角色也是提示沒002的權(quán)限,因?yàn)闄?quán)限只有001。

          六、前端頁面層訪問控制

          有時(shí)為了不想像上面那樣彈出錯(cuò)誤頁面,需要在按鈕顯示上進(jìn)行不可見,這樣用戶也不會(huì)點(diǎn)擊到。前面已經(jīng)引入了依賴并配置了bean,這里測試下在html中使用shiro。

          1.首先設(shè)置html標(biāo)簽引入shiro

          <html xmlns:th="http://www.thymeleaf.org"
           xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
          

          2.控制按鈕可見

          這里使用shiro:hasAnyRoles="002,003"判斷用戶角色是否是002或003,是則顯示不是則不顯示。

           <div class="layui-inline">
           <a shiro:hasAnyRoles="002,003" class="layui-btn layui-btn-normal newsAdd_btn" onclick="addUser('')">添加用戶</a>
           </div>
           <div class="layui-inline">
           <a shiro:hasAnyRoles="002,003" class="layui-btn layui-btn-danger batchDel" onclick="getDatas();">批量刪除</a>
           </div>
          

          當(dāng)001用戶登錄時(shí),添加用戶、批量刪除按鈕都不顯示,只顯示查詢按鈕。

          當(dāng)002用戶登錄時(shí),添加用戶、批量刪除按鈕都顯示

          七、小結(jié)

          這里只是實(shí)現(xiàn)了Shiro的簡單的功能,Shiro還有很多很強(qiáng)大的功能,比如session管理等,而且目前權(quán)限管理模塊還有很多需要優(yōu)化的功能,左側(cè)導(dǎo)航欄的動(dòng)態(tài)加載和權(quán)限控制、Shiro與Redis結(jié)合實(shí)現(xiàn)session共享、Shiro與Cas結(jié)合實(shí)現(xiàn)單點(diǎn)登錄等。后續(xù)可以把項(xiàng)目做為開源項(xiàng)目,慢慢完善集成更多模塊例如:Swagger2、Redis、Druid、RabbitMQ等供初學(xué)者參考。

          實(shí)際項(xiàng)目中,經(jīng)常需要用到角色權(quán)限區(qū)分,以此來為不同的角色賦予不同的權(quán)利,分配不同的任務(wù)。比如,普通用戶只能瀏覽;會(huì)員可以瀏覽和評(píng)論;超級(jí)會(huì)員可以瀏覽、評(píng)論和看視頻課等;實(shí)際應(yīng)用場景很多。毫不夸張的說,幾乎每個(gè)完整的項(xiàng)目都會(huì)涉及到權(quán)限管理。

          因此,這篇文章,阿淼就帶大家將 shiro 權(quán)限框架整合到 SpringBoot 中,以達(dá)到快速的實(shí)現(xiàn)權(quán)限管理的功能。

          在 Spring Boot 中做權(quán)限管理,一般來說,主流的方案是 Spring Security ,但是由于 Spring Security 過于龐大和復(fù)雜,只要能滿足業(yè)務(wù)需要,大多數(shù)公司還是會(huì)選擇 Apache Shiro 來使用。

          一般來說,Spring Security 和 Shiro 的區(qū)別如下:

          Spring SecurityApache Shiro重量級(jí)的安全管理框架輕量級(jí)的安全管理框架概念復(fù)雜,配置繁瑣概念簡單、配置簡單功能強(qiáng)大功能簡單

          這篇文章會(huì)首先帶大家了解 Apache Shiro ,然后再給出使用案例 Demo。

          走進(jìn) Apache Shiro

          官網(wǎng)認(rèn)知

          照例又去官網(wǎng)扒了扒介紹:

          Apache Shiro? is a powerful and easy-to-use Java security framework that performs authentication, authorization, cryptography, and session management. With Shiro’s easy-to-understand API, you can quickly and easily secure any application – from the smallest mobile applications to the largest web and enterprise applications. Apache Shiro?是一個(gè)強(qiáng)大且易用的Java安全框架,能夠用于身份驗(yàn)證、授權(quán)、加密和會(huì)話管理。Shiro擁有易于理解的API,您可以快速、輕松地獲得任何應(yīng)用程序——從最小的移動(dòng)應(yīng)用程序到最大的網(wǎng)絡(luò)和企業(yè)應(yīng)用程序。

          簡而言之,Apache Shiro 是一個(gè)強(qiáng)大靈活的開源安全框架,可以完全處理身份驗(yàn)證、授權(quán)、加密和會(huì)話管理。

          Shiro能到底能做些什么呢?

          • 驗(yàn)證用戶身份
          • 用戶訪問權(quán)限控制,比如:1、判斷用戶是否分配了一定的安全角色。2、判斷用戶是否被授予完成某個(gè)操作的權(quán)限
          • 在非 Web 或 EJB 容器的環(huán)境下可以任意使用Session API
          • 可以響應(yīng)認(rèn)證、訪問控制,或者 Session 生命周期中發(fā)生的事件
          • 可將一個(gè)或以上用戶安全數(shù)據(jù)源數(shù)據(jù)組合成一個(gè)復(fù)合的用戶 “view”(視圖)
          • 支持單點(diǎn)登錄(SSO)功能
          • 支持提供“Remember Me”服務(wù),獲取用戶關(guān)聯(lián)信息而無需登錄 ···

          為什么今天還要使用Apache Shiro?

          對(duì)此,官方給出了詳細(xì)的解釋:shiro.apache.org/

          自2003年以來,框架環(huán)境發(fā)生了很大變化,因此今天仍然有充分的理由使用Shiro。實(shí)際上有很多原因。Apache Shiro是:

          • 易于使用 -易于使用是該項(xiàng)目的最終目標(biāo)。應(yīng)用程序安全性可能非常令人困惑和沮喪,并被視為“必要的邪惡”。如果您使它易于使用,以使新手程序員可以開始使用它,那么就不必再痛苦了。
          • 全面 -Apache Shiro聲稱沒有其他具有范圍廣度的安全框架,因此它可能是滿足安全需求的“一站式服務(wù)”。
          • 靈活 -Apache Shiro可以在任何應(yīng)用程序環(huán)境中工作。盡管它可以在Web,EJB和IoC環(huán)境中運(yùn)行,但并不需要它們。Shiro也不要求任何規(guī)范,甚至沒有很多依賴性。
          • 具有Web功能 -Apache Shiro具有出色的Web應(yīng)用程序支持,使您可以基于應(yīng)用程序URL和Web協(xié)議(例如REST)創(chuàng)建靈活的安全策略,同時(shí)還提供一組JSP庫來控制頁面輸出。
          • 可插拔 -Shiro干凈的API和設(shè)計(jì)模式使它易于與許多其他框架和應(yīng)用程序集成。您會(huì)看到Shiro與Spring,Grails,Wicket,Tapestry,Mule,Apache Camel,Vaadin等框架無縫集成。
          • 受支持 -Apache Shiro是Apache Software Foundation(Apache軟件基金會(huì))的一部分,該組織被證明以其社區(qū)的最大利益行事。項(xiàng)目開發(fā)和用戶群體友好的公民隨時(shí)可以提供幫助。如果需要,像Katasoft這樣的商業(yè)公司也可以提供專業(yè)的支持和服務(wù)。

          Shiro 核心概念

          Apache Shiro 是一個(gè)全面的、蘊(yùn)含豐富功能的安全框架。

          下圖為描述 Shiro 功能的框架圖:


          如圖所示,功能包括:

          • Authentication(認(rèn)證):用戶身份識(shí)別,通常被稱為用戶“登錄”
          • Authorization(授權(quán)):訪問控制。比如某個(gè)用戶是否具有某個(gè)操作的使用權(quán)限。
          • Session Management(會(huì)話管理):特定于用戶的會(huì)話管理,甚至在非web 或 EJB 應(yīng)用程序。
          • Cryptography(加密):在對(duì)數(shù)據(jù)源使用加密算法加密的同時(shí),保證易于使用。

          并且 Shiro 還有通過增加其他的功能來支持和加強(qiáng)這些不同應(yīng)用環(huán)境下安全領(lǐng)域的關(guān)注點(diǎn)。

          特別是對(duì)以下的功能支持:

          • Web支持:Shiro 提供的 Web 支持 api ,可以很輕松的保護(hù) Web 應(yīng)用程序的安全。
          • 緩存:緩存是 Apache Shiro 保證安全操作快速、高效的重要手段。
          • 并發(fā):Apache Shiro 支持多線程應(yīng)用程序的并發(fā)特性。
          • 測試:支持單元測試和集成測試,確保代碼和預(yù)想的一樣安全。
          • "Run As":這個(gè)功能允許用戶假設(shè)另一個(gè)用戶的身份(在許可的前提下)。
          • "Remember Me":跨 session 記錄用戶的身份,只有在強(qiáng)制需要時(shí)才需要登錄。

          注意: Shiro 不會(huì)去維護(hù)用戶、維護(hù)權(quán)限,這些需要我們自己去設(shè)計(jì)/提供,然后通過相應(yīng)的接口注入給 Shiro

          使用案例 Demo

          1.新建 maven 項(xiàng)目

          為方便我們初始化項(xiàng)目,Spring Boot給我們提供一個(gè)項(xiàng)目模板生成網(wǎng)站。

          • 1、打開瀏覽器,訪問:start.spring.io/
          • 2、根據(jù)頁面提示,選擇構(gòu)建工具,開發(fā)語言,項(xiàng)目信息等。

          2.導(dǎo)入 springboot 父依賴

          <parent>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-parent</artifactId>
              <version>2.0.2.RELEASE</version>
          </parent>
          復(fù)制代碼

          3.相關(guān) jar 包

          web 包

          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-web</artifactId>
          </dependency>
          復(fù)制代碼

          shiro-spring 包就是此篇文章的核心

          <dependency>
              <groupId>org.apache.shiro</groupId>
              <artifactId>shiro-spring</artifactId>
              <version>1.4.0</version>
          </dependency>
          shiro 注解會(huì)用到 aop
          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-aop</artifactId>
          </dependency>
          數(shù)據(jù)庫相關(guān)包使用的是mybatisplus
          <dependency>
              <groupId>com.alibaba</groupId>
              <artifactId>druid</artifactId>
              <version>1.1.12</version>
          </dependency>
          <dependency>
              <groupId>mysql</groupId>
              <artifactId>mysql-connector-java</artifactId>
          </dependency>
          <dependency>
              <groupId>com.baomidou</groupId>
              <artifactId>mybatis-plus-boot-starter</artifactId>
              <version>3.1.0</version>
          </dependency>
          <dependency>
              <groupId>com.baomidou</groupId>
              <artifactId>mybatis-plus-generator</artifactId>
              <version>3.1.0</version>
          </dependency>
              <dependency>
              <groupId>org.apache.velocity</groupId>
              <artifactId>velocity-engine-core</artifactId>
              <version>2.0</version>
          </dependency>
          復(fù)制代碼

          4.數(shù)據(jù)庫

          建表語句在項(xiàng)目中有,項(xiàng)目地址: github.com/mmzsblog/mm…

          5.自定義 realm

          public class MyShiroRealm extends AuthorizingRealm {
              @Autowired
              private UserService userService;
              @Autowired
              private RoleService roleService;
              @Autowired
              private PermissionService permissionService;
          
              @Override
              protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
          
                  SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
                  // HttpServletRequest request = (HttpServletRequest) ((WebSubject) SecurityUtils
                  // .getSubject()).getServletRequest();//這個(gè)可以用來獲取在登錄的時(shí)候提交的其他額外的參數(shù)信息
                  String username = (String) principals.getPrimaryPrincipal();
                  // 受理權(quán)限
                  // 角色
                  Set<String> roles = new HashSet<String>();
                  Role role = roleService.getRoleByUserName(username);
                  System.out.println(role.getRoleName());
                  roles.add(role.getRoleName());
                  authorizationInfo.setRoles(roles);
                  // 權(quán)限
                  Set<String> permissions = new HashSet<String>();
                  List<Permission> querypermissions = permissionService.getPermissionsByRoleId(role.getId());
                  for (Permission permission : querypermissions) {
                      permissions.add(permission.getPermissionName());
                  }
                  authorizationInfo.setStringPermissions(permissions);
                  return authorizationInfo;
              }
          
              @Override
              protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken)
                      throws AuthenticationException {
                  String loginName = (String) authcToken.getPrincipal();
                  // 獲取用戶密碼
                  User user = userService.getOne(new QueryWrapper<User>().eq("username", loginName));
                  if (user == null) {
                      // 沒找到帳號(hào)
                      throw new UnknownAccountException();
                  }
                  String password = new String((char[]) authcToken.getCredentials());
                  String inpass = (new Md5Hash(password, user.getUsername())).toString();
                  if (!user.getPassword().equals(inpass)) {
                      throw new IncorrectCredentialsException();
                  }
                  // 交給AuthenticatingRealm使用CredentialsMatcher進(jìn)行密碼匹配
                  SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(loginName, user.getPassword(),
                          ByteSource.Util.bytes(loginName), getName());
          
                  return authenticationInfo;
              }
          
          }
          復(fù)制代碼

          6.shiro 配置類

          @Configuration
          public class ShiroConfiguration {
              private static final Logger logger = LoggerFactory.getLogger(ShiroConfiguration.class);
          
              /**
               * Shiro的Web過濾器Factory 命名:shiroFilter
               */
              @Bean(name = "shiroFilter")
              public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
                  ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
                  // Shiro的核心安全接口,這個(gè)屬性是必須的
                  shiroFilterFactoryBean.setSecurityManager(securityManager);
                  //需要權(quán)限的請(qǐng)求,如果沒有登錄則會(huì)跳轉(zhuǎn)到這里設(shè)置的url
                  shiroFilterFactoryBean.setLoginUrl("/login.html");
                  //設(shè)置登錄成功跳轉(zhuǎn)url,一般在登錄成功后自己代碼設(shè)置跳轉(zhuǎn)url,此處基本沒用
                  shiroFilterFactoryBean.setSuccessUrl("/main.html");
                  //設(shè)置無權(quán)限跳轉(zhuǎn)界面,此處一般不生效,一般自定義異常
                  shiroFilterFactoryBean.setUnauthorizedUrl("/error.html");
                  Map<String, Filter> filterMap = new LinkedHashMap<>();
                  // filterMap.put("authc", new AjaxPermissionsAuthorizationFilter());
                  shiroFilterFactoryBean.setFilters(filterMap);
                  /*
                   * 定義shiro過濾鏈 Map結(jié)構(gòu)
                   * Map中key(xml中是指value值)的第一個(gè)'/'代表的路徑是相對(duì)于HttpServletRequest.getContextPath()的值來的
                   * anon:它對(duì)應(yīng)的過濾器里面是空的,什么都沒做,這里.do和.jsp后面的*表示參數(shù),比方說login.jsp?main這種
                   * authc:該過濾器下的頁面必須驗(yàn)證后才能訪問,它是Shiro內(nèi)置的一個(gè)攔截器org.apache.shiro.web.filter.authc.
                   * FormAuthenticationFilter
                   */
                  Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
                  /*
                   * 過濾鏈定義,從上向下順序執(zhí)行,一般將 /**放在最為下邊; authc:所有url都必須認(rèn)證通過才可以訪問;
                   * anon:所有url都都可以匿名訪問
                   */
                  filterChainDefinitionMap.put("/login.html", "authc");
                  filterChainDefinitionMap.put("/login", "anon");
                  filterChainDefinitionMap.put("/js/**", "anon");
                  filterChainDefinitionMap.put("/css/**", "anon");
                  filterChainDefinitionMap.put("/logout", "logout");
                  filterChainDefinitionMap.put("/**", "authc");
                  shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
                  return shiroFilterFactoryBean;
              }
          
              /**
               * 權(quán)限管理
               */
              @Bean
              public SecurityManager securityManager() {
                  logger.info("=======================shiro=======================");
                  DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
                  securityManager.setRealm(MyShiroRealm());
                  // securityManager.setRememberMeManager(rememberMeManager);
                  return securityManager;
              }
          
              /**
               * Shiro Realm 繼承自AuthorizingRealm的自定義Realm,即指定Shiro驗(yàn)證用戶登錄的類為自定義的
               */
              @Bean
              public MyShiroRealm MyShiroRealm() {
                  MyShiroRealm userRealm = new MyShiroRealm();
                  userRealm.setCredentialsMatcher(hashedCredentialsMatcher());
                  return userRealm;
              }
          
              /**
               * 憑證匹配器 密碼驗(yàn)證
               */
              @Bean(name = "credentialsMatcher")
              public HashedCredentialsMatcher hashedCredentialsMatcher() {
                  HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();
                  // 散列算法:這里使用MD5算法;
                  hashedCredentialsMatcher.setHashAlgorithmName("md5");
                  // 散列的次數(shù),比如散列兩次,相當(dāng)于 md5(md5(""));
                  hashedCredentialsMatcher.setHashIterations(1);
                  // storedCredentialsHexEncoded默認(rèn)是true,此時(shí)用的是密碼加密用的是Hex編碼;false時(shí)用Base64編碼
                  hashedCredentialsMatcher.setStoredCredentialsHexEncoded(true);
                  return hashedCredentialsMatcher;
              }
          
              /**
               * 開啟Shiro的注解(如@RequiresRoles,@RequiresPermissions),需借助SpringAOP掃描使用Shiro注解的類,并在必要時(shí)進(jìn)行安全邏輯驗(yàn)證
               */
              @Bean
              public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor() {
                  AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
                  authorizationAttributeSourceAdvisor.setSecurityManager(securityManager());
                  return authorizationAttributeSourceAdvisor;
              }
          
          }
          復(fù)制代碼

          7.考試類

          @RestController
          public class UserController {
              @PostMapping("login")
              public String name(String username, String password) {
                  String result = "已登錄";
                  Subject currentUser = SecurityUtils.getSubject();
                  UsernamePasswordToken token = new UsernamePasswordToken(username, password);
                  if (!currentUser.isAuthenticated()) {
                      try {
                          currentUser.login(token);// 會(huì)觸發(fā)com.shiro.config.MyShiroRealm的doGetAuthenticationInfo方法
                          result = "登錄成功";
                      } catch (UnknownAccountException e) {
                          result = "用戶名錯(cuò)誤";
                      } catch (IncorrectCredentialsException e) {
                          result = "密碼錯(cuò)誤";
                      }
                  }
                  return result;
              }
          
              @GetMapping("logout")
              public void logout() {
                  Subject currentUser = SecurityUtils.getSubject();
                  currentUser.logout();
              }
          
              @RequiresPermissions("role:update")
              @GetMapping("/role")
              public String name() {
                  return "hello";
              }
          
              @RequiresPermissions("user:select")
              @GetMapping("/role2")
              public String permission() {
                  return "hello sel";
              }
          
          }
          復(fù)制代碼

          7.1 登錄測試

          數(shù)據(jù)庫賬號(hào)(密碼經(jīng)過md5加鹽加密)




          7.2 權(quán)限測試

          8.說明

          8.1 無權(quán)限時(shí)的處理

          無權(quán)限時(shí)自定義了一個(gè)異常。所以,權(quán)限測試的時(shí)候沒有權(quán)限就會(huì)提示配置的提示語 “沒有權(quán)限”。

          @ControllerAdvice
          public class ShiroException {
              @ExceptionHandler(value = UnauthorizedException.class)
              @ResponseBody
              public String name() {
                  return "沒有權(quán)限";
              }
          }
          復(fù)制代碼

          8.2 角色權(quán)限測試與權(quán)限測試相同

          權(quán)限設(shè)置可在shiro配置類中shiro過濾鏈設(shè)置,也可用注解方式設(shè)置,本文使用注解方式。

          8.3 shiro 的 session 和 cache

          shiro 的 session 和 cache 管理可以自定義,本文用的是默認(rèn)的,推薦自定義,方便管理。

          小結(jié)

          • Apache Shiro是Java的一個(gè)安全框架
          • Shiro是一個(gè)強(qiáng)大的簡單易用的Java安全框架,主要用來更便捷的認(rèn)證、授權(quán)、加密、會(huì)話管理、與Web集成、緩存等
          • Shiro使用起來小而簡單
          • spring中有spring security ,是一個(gè)權(quán)限框架,它和spring依賴過于緊密,沒有shiro使用簡單。
          • shiro不依賴于spring,shiro不僅可以實(shí)現(xiàn)web應(yīng)用的權(quán)限管理,還可以實(shí)現(xiàn)c/s系統(tǒng),分布式系統(tǒng)權(quán)限管理,
          • shiro屬于輕量框架,越來越多企業(yè)項(xiàng)目開始使用shiro.

          hiro 1.7.0 發(fā)布,此版本包括自 1.6.0 版本以來解決的 7 個(gè)問題,現(xiàn)在可以從 maven 中央倉庫下載使用。

          <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-all</artifactId>
            <version>1.7.0</version>
            <type>pom</type>
          </dependency>
          

          值得注意的是:

          • 默認(rèn)情況下禁用 session 路徑重寫。
          • 添加系統(tǒng)屬性以啟用反斜杠路徑限制。
          • DeleteMe cookie 使用定義 sameSite。
          • Spring shiro 添加 cookiesamesite 的配置選項(xiàng)。
          • SslFilter 支持 HTTP 嚴(yán)格傳輸安全性(HSTS) 。

          關(guān)于 shiro 1.7 changelog 可以參考 issues.apache.org/jira

          有關(guān) Shiro 的更多信息,請(qǐng)閱讀文檔 http://shiro.apache.org/documentation.html。

          Apache Shiro 是一個(gè)強(qiáng)大且易用的 Java 安全框架,執(zhí)行身份驗(yàn)證、授權(quán)、密碼和會(huì)話管理。使用 Shiro 的易于理解的 API,您可以快速、輕松地獲得任何應(yīng)用程序,從最小的移動(dòng)應(yīng)用程序到最大的網(wǎng)絡(luò)和企業(yè)應(yīng)用程序。


          主站蜘蛛池模板: 蜜桃传媒一区二区亚洲AV| 国产福利一区二区| 老鸭窝毛片一区二区三区| 久久久久人妻精品一区三寸| 精品无码国产一区二区三区51安| 精品欧洲AV无码一区二区男男| 久久精品黄AA片一区二区三区| 日韩AV无码一区二区三区不卡毛片 | 国产高清视频一区二区| 美女视频免费看一区二区| 一区二区三区观看| 亚洲国产一区二区三区青草影视| 久久4k岛国高清一区二区| 国产精品视频一区二区猎奇| 在线日韩麻豆一区| 国产亚洲一区二区在线观看| 色噜噜狠狠一区二区三区果冻| 学生妹亚洲一区二区| 波多野结衣中文一区二区免费| 一区二区三区福利| 蜜桃视频一区二区三区在线观看| 无码中文字幕一区二区三区| 一区二区精品在线观看| 蜜桃臀无码内射一区二区三区| 日韩精品一区二区三区老鸦窝| 激情内射亚州一区二区三区爱妻| 亚洲一区二区三区在线| 极品少妇伦理一区二区| 极品人妻少妇一区二区三区| 国产精品亚洲综合一区| 无码精品一区二区三区| 久久精品国产免费一区| 精品女同一区二区| 无码一区18禁3D| 亚洲国产韩国一区二区| 在线精品亚洲一区二区小说| 天天看高清无码一区二区三区| 国产精品福利一区二区| 亚洲福利视频一区| 综合人妻久久一区二区精品| 久99精品视频在线观看婷亚洲片国产一区一级在线 |