前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >安全框架Shiro入门

安全框架Shiro入门

作者头像
李家酒馆酒保
发布2017-12-27 11:53:16
1.1K0
发布2017-12-27 11:53:16
举报
文章被收录于专栏:李家的小酒馆李家的小酒馆

Shiro简介

Apache Shiro是Java的一个安全框架,官网为shiro.apache.org,主要场景为控制登陆,判断用户是否有访问某个功能的权限等等。

Shiro的核心功能(入门知识,只介绍前两个)

  • 认证
  • 授权
  • 会话管理
  • 加密

引入jar包和配置web.xml

代码语言:txt
复制
引入Shiro对应的jar包,下面给出Maven
 <dependency>     
     <groupId>org.apache.shiro</groupId>     
     <artifactId>shiro-all</artifactId>     
     <version>1.2.2</version> 
  </dependency>
代码语言:txt
复制
在web.xml中配置spring框架提供的用于整合shiro框架的过滤器
     <!-- 配置shiro过滤器 --> 
     <filter>     
          <filter-name>shiroFilter</filter-name>    // 需要在spring的配置文件中创建一个bean(shiroFilter)     
          <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>    
      </filter> 
      <filter-mapping>    
            <filter-name>shiroFilter</filter-name>     
            <url-pattern>/*</url-pattern> 
      </filter-mapping>

下面我们将要进行Shiro的认证功能和授权功能的实现,代码比较多。

登录方法的实现

Shiro认证的流程
  • Application Code:应用程序代码, 即登录方法(登录方法不是直接查询数据库,而是调用Shiro框架提供的接口来实现)
  • Subject:框架提供的接口,代表当前用户对象
  • SecurityManager:框架提供的接口,代表安全管理器对象
  • Realm:可以开发人员编写(即认证和授权方法)
代码语言:txt
复制
我们首先将登录方法按照Shiro指定的方式进行改进
  public String login() {     
      // 获取验证码     
      String validateCode = (String) ServletActionContext.getRequest().getSession().getAttribute("key");     
      // 判断验证码     
      if (StringUtils.isNotBlank(checkcode) && checkcode.equals(validateCode)) {           
          // 获取getSubject对象,Shiro中代表当前用户对象         
          Subject subject = SecurityUtils.getSubject();          
          // 令牌 传递进去前台接受的账号和密码         
          AuthenticationToken token = new UsernamePasswordToken(model.getUsername(),      
          MD5Utils.md5(model.getPassword()));// 创建用户名密码令牌对象         
          try {             
              subject.login(token); // 调用内置的登录方法来实现检验 如果登陆错误就会抛出异常,返回登录页面   
          } catch (Exception e) {             
              e.printStackTrace();             
              return LOGIN;         
           }         
           User user = (User) subject.getPrincipal();   // 登录成功后可以从subject取得登录对象   
           ServletActionContext.getRequest().getSession().setAttribute("loginUser", user);      
           return HOME;      
           
           } else {         
               this.addActionError("输入验证码错误");         
               return LOGIN;     
           }  
  }
代码语言:txt
复制
然后编写
代码语言:txt
复制
到上面以后编码工作就完成了,剩下的就是进行配置了,首先将编写的
代码语言:txt
复制
配置
代码语言:txt
复制
Shiro还提供了使用

Shiro提供的控制权限的方式

  • URL权限拦截控制
  • 方法注解权限控制
  • 页面标签权限控制(当有对应的权限就显示对应的页面元素,没有权限则不显示), 需要在对应的页面引入Shiro的标签库 <%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>,可以用在HTMl也可以用在JS中。
  • 代码级别权限控制(在方法内添加代码)

Shiro整合ehcache缓存权限数据

如果访问一个页面就执行一次授权,就会访问数据库,浪费资源,所以我们可以使用ehcache来进行缓存权限,只要登录时进行一次授权,后面无需再次授权,直接使用缓存。

shiro自动整合ehcache,只需要简单配置就能使用。

代码语言:txt
复制
在根目录下建立
  • 在spring配置文件中配置缓存管理器对象,并注入给安全管理器对象
代码语言:javascript
复制
        <!-- 注册ehcache -->
    <bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
        <property name="cacheManagerConfigFile" value="classpath:ehcache.xml" />
    </bean>
  • 将ehcache注入到shiro的配置管理器,shiro会自动使用缓存管理,在原来的管理器中添加<property name="cacheManager" ref="cacheManager"/> 一条语句即可。
代码语言:javascript
复制
        <!-- 注册安全管理器对象 -->
    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <property name="realm" ref="bosRealm"/>
        <!-- 将ehcache注入shiro -->
        <property name="cacheManager" ref="cacheManager"/>
    </bean>
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-11-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Shiro简介
  • Shiro的核心功能(入门知识,只介绍前两个)
  • 引入jar包和配置web.xml
  • 登录方法的实现
    • Shiro认证的流程
    • Shiro提供的控制权限的方式
    • Shiro整合ehcache缓存权限数据
    相关产品与服务
    验证码
    腾讯云新一代行为验证码(Captcha),基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证。最大程度保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档