0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

shiro如何实现Web应用认证

科技绿洲 来源:Java技术指北 作者:Java技术指北 2023-10-08 14:53 次阅读

前面简单介绍了shiro这个框架的一些基本知识,包括其架构模型,主要的功能,关键名称的含义,以及核心模块和对应的接口定义。

开始的话

今天我们从一个简单示例,先了解使用shiro实现Web应用认证时,一名开发者需要做些什么。同样秉持着技术学习的原则,我们仅仅使用shiro框架以及一些其他简化开发的工具库,不会涉及到一些IOC容器,这样在进行模块配置以及依赖关系梳理时,通过手动的配置的方式,让我们更加容易理解...

文章介绍

通过这篇文章,你可以有以下几个方面的收获:

  • 基于maven创建一个项目,养成项目依赖统一管理的习惯
  • 了解shiro在项目中的使用过程以及相关的配置
  • 了解如何实现通过shiro完成认证以及授权
  • 了解shiro认证流程
  • 对shiro从理论的认识升华到基础实践
  • 获得一个演示示例

示例实现

创建项目

1) 你可以选择通过你的IDE快速创建一个项目,比如通过Intellij Idea,通过File->New->Project选择Maven Archetype创建一个空项目,这里archetype可以选择quickstart

图片

这里你很可能遇到一个idea的bug,按上图提交后,发现idea卡死了,项目创建失败且无法打开,如果没有就恭喜你了

2)最终我们会得到一个文件夹,里面包含一个pom.xml文件,结构如下(如果有其他的内容建议删除,比如src,因为这个pom我们作为项目parent维护)

图片

添加依赖

细心的你会注意到,在根目录下有个pom.xml,同时还有个ui-mvc目录下也有个pom.xml文件,根目录下的我一般习惯作为整个项目的父级依赖配置文件,用来管理所有依赖、插件版本以及属性值,ui-mvc下的pom主要通过parent实现属性继承,这样来实现配置集中化管理

./pom.xml

< project >
 //...
   < groupId >com.sucls.security< /groupId >
    < artifactId >auth-shiro< /artifactId >
    < version >1.0-SNAPSHOT< /version >
    < packaging >pom< /packaging >
    
    < properties >
     < project.build.sourceEncoding >UTF-8< /project.build.sourceEncoding >
     < maven.compiler.source >1.8< /maven.compiler.source >
     < maven.compiler.target >1.8< /maven.compiler.target >
     < shiro.version >1.9.1< /shiro.version >
     // ...
  < /properties >
    
 < dependencyManagement >
  < dependencies >
    < !-- 核心 -- >
    < dependency >
      < groupId >org.apache.shiro< /groupId >
      < artifactId >shiro-core< /artifactId >
      < version >${shiro.version}< /version >
    < /dependency >

    < dependency >
      < groupId >org.apache.shiro< /groupId >
      < artifactId >shiro-web< /artifactId >
      < version >${shiro.version}< /version >
    < /dependency >
    // ...
    < /dependencies >
 < /dependencyManagement >
   // ...
< /project >

./ui-mvc/pom.xml

< parent >
  < groupId >com.sucls.security< /groupId >
  < artifactId >auth-shiro< /artifactId >
  < version >1.0-SNAPSHOT< /version >
  < relativePath >../../pom.xml< /relativePath >
< /parent >
< artifactId >auth-shiro-ui-mvc< /artifactId >
< packaging >war< /packaging >
< name >ui-mvc< /name >

< dependencies >
  < !-- 核心 -- >
  < dependency >
    < groupId >org.apache.shiro< /groupId >
    < artifactId >shiro-core< /artifactId >
  < /dependency >
  < dependency >
    < groupId >org.apache.shiro< /groupId >
    < artifactId >shiro-web< /artifactId >
  < /dependency >
< /dependencies >

大部分内容都省略了,可以参考文末源代码,主要引入了shiro相关的依赖,以及一个提高开发效率的工具包

编写shiro相关配置

我们所有代码都会写到ui-mvc模块下,看到名称就知道我们通过mvc的结构,因此前端是通过jsp这个老技术,后面会讲到如何通过前后端分离来实现认证功能。

下面主要从以下几个方面进行配置:
web.xml以前说过,认证基本都是基于Filter实现,同样shiro有一个核心的过滤器(该过滤器会将我们的配置解析成一个个过滤器链)

< filter >
 < filter-name >shiroFilter< /filter-name >
 < filter-class >org.apache.shiro.web.servlet.ShiroFilter< /filter-class >
< /filter >

< filter-mapping >
 < filter-name >shiroFilter< /filter-name >
 < url-pattern >/*< /url-pattern >
< /filter-mapping >

配置监听,在系统启动时基于ServletContextListener调用初始化参数完成一些基本的系统初始化工作

< context-param >
 < param-name >shiroEnvironmentClass< /param-name >
 < param-value >org.apache.shiro.web.env.DefaultWebEnvironment< /param-value >
< /context-param >

< listener >
 < listener-class >com.sucls.security.security.SimpleEnvironmentLoaderListener< /listener-class >
< /listener >

这里通过自定义的监听,SimpleEnvironmentLoaderListener类承载了shiro基本上所有的配置,在这里我们会完整地构建SecurityManager对象以及Filter的配置,如果读过以前的文章你就会知道,SecurityManager主要的工作包括:

  • 代理实现用户身份的认证
  • 对API结果进行缓存
  • 实现了用户多种形式登录(多Realm)
  • 实现用户会话管理
  • 实现记住我功能
  • ...

ShiroFilter配置

FormAuthenticationFilter authcFilter = (FormAuthenticationFilter) filterChainResolver.getFilterChainManager().getFilters().get(DefaultFilter.authc.name());
        authcFilter.setLoginUrl("/login.jsp");
        authcFilter.setSuccessUrl("/index.html");

filterChainResolver.getFilterChainManager().addToChain("/webjars/**", DefaultFilter.anon.name());
filterChainResolver.getFilterChainManager().addToChain("/assets/**", DefaultFilter.anon.name());

filterChainResolver.getFilterChainManager().addToChain("/**", DefaultFilter.authc.name());

这里主要通过配置FilterChainResolver对象来完成ShiroFilter对象的构建,后面讲到源代码时会细说。

SecurityManager配置

private void configureWebSecurityManager(DefaultWebSecurityManager securityManager) {
//
        securityManager.setAuthenticator(newAuthenticator());

        securityManager.setRealms(Arrays.asList(initRealm()));
    }

    private Authenticator newAuthenticator() {
        ModularRealmAuthenticator authenticator = new ModularRealmAuthenticator();
        authenticator.setAuthenticationStrategy(new AtLeastOneSuccessfulStrategy()); // 至少一个Realm
        authenticator.setRealms(Arrays.asList(initRealm()) );
        return authenticator;
    }

 private Realm initRealm(){
        return RealmBuilder.create()
                .inMemoryRealm()                .user("admin").password("123456").role("ROLE_ADMIN").permissions(Arrays.asList("read","edit","create","delete"))
                .and()
                    .user("user").password("123456").role("ROLE_USER").permission("read")
                .build();
    }

这里仅根据需要配置了Realm以及认证规则Authenticator

引入页面

前端模板来源bootstrap quick,在此基础上修改了远程资源(js、css)为本地引用,以及引入jsp文件头对应的配置

启动项目

通过引入tomcat插件来启动项目:

< plugin >
    < groupId >org.apache.tomcat.maven< /groupId >
    < artifactId >tomcat7-maven-plugin< /artifactId >
    < version >2.2< /version >
    < configuration >
        < port >8080< /port >
        < path >/< /path >
    < /configuration >
< /plugin >

这样不需要我们单独弄个tomcat,通过插件即可实现项目热启动,方便调试与静态页面的修改

图片

执行认证

1)进入系统 http://localhost:8080/ 由于没有登录,跳转到登录页http://localhost:8080/login.jsp

图片

2)输入用户名密码,按以上的配置admin/123456,登录成功,进入主页

图片

3)用户鉴权,上面可以看到admin配置了ROLE_ADMIN角色,user配置了ROLE_USER角色,所以

admin登录时:

访问 http://localhost:8080/system/getProperties.json 正常返回数据 ;

访问 http://localhost:8080/subject/getSubject.json 进入未授权页面

关于shiro鉴权部分主要是基于Filter以及AOP完成,其中请求交易基于Filter,在请求时基于登录权限信息进行交易拦截,而AOP则可以针对方法的调用阶段,更加灵活和通用。具体的实现过程后面会细说,同时可以看到示例简单的实现过程

示例分析

在整个示例中,回忆我们做了什么,有什么用?

  1. 引入shiro相关的依赖包,这点没什么说的
  2. 配置web.xml的Filter以及Listener Listener则是基于Servlet的ServletContextListener规则,在web容器启动后,调用contextInitialized方法完成容器初始化工作。这里的初始化包括:
  • 对SecurityManager的配置,后面我们会看到关于shiro的配置基本都是针对这个对象。包括Realm、多Realm认证策略、RememberMe、SessionManager等等
  • 对FilterChainResolver的配置,目的是为了完善ShiroFilter对象,主要针对请求路径对应的过滤器,下面每一行都是一个根据请求路径匹配的过滤器链,一段请求匹配,则进入对应过滤器链,所有注意配置顺序
/assets/** = anon
/login = authc
/admin/** = roles[ROLE_ADMIN]
/admin/add* = perms[add:*]   //[action:type:instance]
/** = authc
  1. 引入静态页面,这里基于jsp实现,当然还有其他前端模板引擎可以使用,其中静态资源通过引入webjars来加载
  2. 由于没有引入springmvc,在资源映射(请求到页面或交易)以及依赖管理、AOP装配等等都是手动通过代码完成,增加了代码复杂度,但是结构会更清晰,更容易理解

要知道,我们的目的是为SecurityManager注入属性以及配置ShiroFilter过滤规则,并不一定需要基于ServletContextListener,这只是一个选择,比如还可以在Filter的init方法中完成,只要保证系统启动后对应的配置加载或处理完成即可。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 模块
    +关注

    关注

    7

    文章

    2705

    浏览量

    47464
  • 接口
    +关注

    关注

    33

    文章

    8593

    浏览量

    151132
  • 容器
    +关注

    关注

    0

    文章

    495

    浏览量

    22061
  • Web应用
    +关注

    关注

    0

    文章

    16

    浏览量

    3476
收藏 人收藏

    评论

    相关推荐

    uClinux下动态Web技术的实现方法

    分析uClinux 操作系统的特点, 实现uClinux 下的Boa Web Server; 讨论如何通过编写CGI 程序来最终实现uClinux 下的动态Web 页面技术。
    发表于 04-15 11:10 17次下载

    基于网格环境实现WEB应用编程研究

            本文分析了现存web 应用系统存在的主要问题。提出了基于网格环境实现web 应用的框架和模型。并对具体过程进行了阐述。关键词:
    发表于 09-05 09:12 5次下载

    uClinux下动态Web技术的实现方法

    摘要:介绍uClinux操作系统的御,实现uClinux下的Boa Web Server;讨论如何通过编写CGI程序来最终实现uClinux下的动态Web页面技术。
    发表于 03-11 12:43 576次阅读
    uClinux下动态<b class='flag-5'>Web</b>技术的<b class='flag-5'>实现</b>方法

    基于Linux的WEB服务器的设计与实现

    基于Linux的WEB服务器的设计与实现 嵌入式WEB服务器的主要设计思想就是将嵌入式系统和 WEB技术结合起来,将 WEB技术引入到现场
    发表于 10-06 08:30 3045次阅读
    基于Linux的<b class='flag-5'>WEB</b>服务器的设计与<b class='flag-5'>实现</b>

    HTTP认证及其在Web平台中的实现

    一、前言 HTTP认证Web服务器对客户端的权限进行认证的一种方式,能够为Web应用提供一定程度的安全保障。目前一些Web应用项目已经提出
    发表于 05-03 16:27 27次下载

    基于Web的智能答疑系统的设计和实现刘江平

    基于Web的智能答疑系统的设计和实现_刘江平
    发表于 03-16 08:00 0次下载

    shiro简单教程,环境搭建,权限控制,登陆验证

    shiro简单教程,环境搭建,权限控制,登陆验证
    发表于 09-09 08:18 9次下载
    <b class='flag-5'>shiro</b>简单教程,环境搭建,权限控制,登陆验证

    Apache Shiro框架的详细资料说明

    自 2015 年 9 月 10 日以来,KyCore 项目中的用户机制已被完整地替换为了以 Apache Shiro 框架为基础建立的全新用户机制,原有的用户机制已基本上被全部删除。更新以来,同事们
    发表于 03-08 08:00 4次下载
    Apache <b class='flag-5'>Shiro</b>框架的详细资料说明

    如何一键实现openWRT的web认证功能

    我们应该了解了Lua语言在OpenWrt Web配置页面的基本对应功能设计方法。本文将以一个页面为例, 来说明Lua 语言如何实现页面控件以及怎么使输入或操作的选项在系统中生效。
    发表于 12-31 11:12 15次下载
    如何一键<b class='flag-5'>实现</b>openWRT的<b class='flag-5'>web</b><b class='flag-5'>认证</b>功能

    使用RESTful Web服务的过程

    本指南将引导您完成创建使用#spring# #spring认证# RESTful Web 服务的应用程序的过程。
    的头像 发表于 09-06 15:47 710次阅读

    shiro综合利用工具介绍

    shiro综合利用工具:ShiroExp   工具介绍 shiro一把梭工具,该轮子主要有三大功能如下: 1、默认密钥爆破 利用SimplePrincipalCollection进行检测 利用
    的头像 发表于 10-24 11:14 5404次阅读

    再见了shiro

    在分布式项目里,比如电商项目,其实不太需要明确的权限划分,说白了,我认为没必要做太麻烦的权限管理,一切从简。何况shiro对于springCloud等各种分布式框架来说,简直就是“灾难”。
    的头像 发表于 01-15 11:32 710次阅读

    Shiro功能介绍

    记得做的第一个Web项目,系统认证授权这块就是基于Shiro实现的,当时也是第一次接触到这种类型的框架,同时是基于Spring做的集成,并且相关的配置都已经是定制好的,只需要我们根据项
    的头像 发表于 10-08 15:07 494次阅读
    <b class='flag-5'>Shiro</b>功能介绍

    基于Web的远程监控系统设计及实现

    电子发烧友网站提供《基于Web的远程监控系统设计及实现.pdf》资料免费下载
    发表于 10-18 09:53 0次下载
    基于<b class='flag-5'>Web</b>的远程监控系统设计及<b class='flag-5'>实现</b>

    一个简单的Shiro RCE检测和利用脚本

    一个简单的Shiro RCE检测和利用脚本。
    的头像 发表于 01-09 09:46 643次阅读