当前位置: 首页 > 科技观察

学习web安全框架,必须要从Shrio开始...

时间:2023-03-14 21:56:25 科技观察

大家好,我是北君。接下来我会花点时间,从shiro开始,给大家介绍一系列的认证框架,看看它们一般都有哪些模块,有哪些功能,如何用好。前面简单介绍了shiro框架的一些基础知识,包括其架构模型、主要功能、键名含义、核心模块及对应的接口定义。今天就通过一个简单的例子来了解开发者在使用shiro实现web应用认证时需要做什么。同样本着技术学习的原则,我们只使用shiro框架和其他一些简化开发的工具库,不涉及一些IOC容器。这样在配置模块和整理依赖的时候,我们就可以手动配置了。更容易理解...文章介绍通过本文,您可以获得以下方面的收获:基于maven创建项目,养成项目依赖统一管理的习惯,了解shiro在项目中的使用流程及相关配置了解Howto通过shiro实现认证授权了解shiro认证流程将shiro从理论理解升华到基础实践获取演示示例示例实现创建项目1)可以选择通过自己的IDE快速创建项目,比如通过IntellijIdea,通过File->New->Project选择MavenArchetype创建一个空项目,这里archetype可以选择quickstart这里你很可能会遇到ideabug,按照上图提交后发现idea卡住了,项目创建失败,打不开,如果打不开,恭喜2)最后,我们会得到一个文件夹,里面有一个pom.xmlfile结构如下(如果有其他内容,建议删掉,比如src,因为我们维护的是这个pom作为项目parent)小心添加依赖你会发现根目录下有一个pom.xml,并且在ui-mvc目录下还有一个pom.xml文件。我一般使用根目录作为整个项目的父级依赖配置文件。使用来管理所有依赖、插件版本和属性值,ui-mvc下的pom主要通过parent实现属性继承,实现集中配置管理。/pom.xml//...com.sucls.securityauth-shiro1.0-SNAPSHOTpomUTF-8;1.81.81.9.1//...org.apache.shiroshiro-core${shiro.version}org.apache.shiroshiro-web${shiro.version}//...//..../ui-mvc/pom.xmlcom.sucls.securityauth-shiro<版本>1.0-SNAPSHOT../../pom.xmlauth-shiro-ui-mvcwarui-mvcorg.apache.shiroshiro-coreorg.apache.shiroshiro-web大部分内容省略,可以参考文末源码,主要介绍shiro相关的依赖,以及一个提高开发效率的Toolkit编写shiro相关的配置我们所有的代码都会写在ui-mvc模块下,一看名字就知道mvc的结构,所以前端使用jsp的老技术,后面会讲到如何通过前后端分离来实现认证功能下面主要从以下几个方面进行配置:web.xml之前说了认证基本是基于Filter实现的,shiro也有一个核心的filter(这个filter会把我们的配置一个一个解析成filter链)shiroFilterorg.apache.shiro.web.servlet.ShiroFiltershiroFilter/*配置监听,在系统启动时根据ServletContextListener调用初始化参数完成一些基本的系统初始化工作shiroEnvironmentClassorg.apache.shiro.web.env.DefaultWebEnvironmentcom.sucls.security.security.SimpleEnvironmentLoaderListener这里通过自定义监听,SimpleEnvironmentLoaderListener类承载了基础的lyshiro的所有配置。在这里,我们将完整地构建SecurityManager对象和Filter配置。如果你看过前面的文章,你就会知道SecurityManager的主要任务包括:代理实现用户身份认证,缓存API结果,实现用户多形式(多Realm)登录,实现用户会话管理,实现remember我的功能。..ShiroFilter配置FormAuthenticationFilterauthcFilter=(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配置privatevoidconfigureWebSecurityManager(DefaultWebSecurityManagersecurityManager){//securityManager.setAuthenticator(newAuthenticator());securityManager.setRealms(Arrays.asList(initRealm()));}privateAuthenticatornewAuthenticator(){ModularRealmAuthenticatorauthenticator=newModularRealmAuthenticator();authenticator.setAuthenticationStrategy(newAtLeastOneSuccessfulStrategy());//至少一个Realmauthenticator.setRealms(Arrays.asList(initRealm()));返回验证器;}privateRealminitRealm(){返回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导入页面前端模板源码bootstrapquick,在此基础上,将远程资源(js、css)修改为本地引用,引入jsp文件头对应的配置。启动项目引入tomcat插件:org.apache.tomcat。maventomcat7-maven-plugin2.28080/这样我们就不需要单独做一个tomcat了,通过插件可以热启动项目,方便调试和静态页面的修改和执行认证1)进入系统http://localhost:8080/由于没有登录,跳转到登录页面http://localhost:8080/login.jsp2)输入用户名和密码,按照上面的配置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对于方法的调用阶段可以更灵活通用具体的实现过程后面会详细介绍,同时可以看到一个简单的实现过程实例分析的例子整个例子中,回想一下我们做了什么,有什么用呢?引入shiro相关的依赖包。配置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引入静态页面,基于jsp实现,当然也可以使用其他前端模板引擎,其中静态资源由介绍网络罐。由于没有引入springmvc,资源映射(请求到页面或事务)和依赖管理、AOP组装等都是通过代码手动完成,增加了代码的复杂度,但结构会更清晰易懂。您应该知道我们的目的是为SecurityManager注入属性并配置ShiroFilter过滤规则。不一定需要基于ServletContextListener。这只是一个选项。比如也可以在Filter的init方法中完成,只要在系统启动后加载或处理相应的配置即可。示例代码代码参考https://github.com/sucls/auth-shiro结束语本文主要通过实例来了解如何使用shiro完成web应用的认证,但是如何实现,有哪些配置,以及具体配置的作用。