转帖:http://jinnianshilongnian.iteye.com/blog/2020820
之前章节我们已经接触过一些INI配置规则了,如果大家使用过如Spring之类的IoC/DI容器的话,Shiro提供的INI配置也是非常类似的,即可以理解为是一个IoC/DI容器,但是区别在于它从一个根对象securityManager开始。
4.1 根对象SecurityManager
从之前的Shiro架构图可以看出,Shiro是从根对象SecurityManager进行身份验证和授权的;也就是所有操作都是自它开始的,这个对象是线程安全且真个应用只需要一个即可,因此Shiro提供了SecurityUtils让我们绑定它为全局的,方便后续操作。
因为Shiro的类都是POJO的,因此都很容易放到任何IoC容器管理。但是和一般的IoC容器的区别在于,Shiro从根对象securityManager开始导航;Shiro支持的依赖注入:public空参构造器对象的创建、setter依赖注入。
1、纯Java代码写法
- DefaultSecurityManager securityManager = new x();
- //设置authenticator
- ModularRealmAuthenticator authenticator = new ModularRealmAuthenticator();
- authenticator.setAuthenticationStrategy(new AtLeastOneSuccessfulStrategy());
- securityManager.setAuthenticator(authenticator);
- //设置authorizer
- ModularRealmAuthorizer authorizer = new ModularRealmAuthorizer();
- authorizer.setPermissionResolver(new WildcardPermissionResolver());
- securityManager.setAuthorizer(authorizer);
- //设置Realm
- DruidDataSource ds = new DruidDataSource();
- ds.setDriverClassName("com.mysql.jdbc.Driver");
- ds.setUrl("jdbc:mysql://localhost:3306/shiro");
- ds.setUsername("root");
- ds.setPassword("");
- JdbcRealm jdbcRealm = new JdbcRealm();
- jdbcRealm.setDataSource(ds);
- jdbcRealm.setPermissionsLookupEnabled(true);
- securityManager.setRealms(Arrays.asList((Realm) jdbcRealm));
- //将SecurityManager设置到SecurityUtils 方便全局使用
- SecurityUtils.setSecurityManager(securityManager);
- Subject subject = SecurityUtils.getSubject();
- UsernamePasswordToken token = new UsernamePasswordToken("zhang", "123");
- subject.login(token);
- Assert.assertTrue(subject.isAuthenticated());
2.1、等价的INI配置(shiro-config.ini)
- [main]
- #authenticator
- authenticator=org.apache.shiro.authc.pam.ModularRealmAuthenticator
- authenticationStrategy=org.apache.shiro.authc.pam.AtLeastOneSuccessfulStrategy
- authenticator.authenticationStrategy=$authenticationStrategy
- securityManager.authenticator=$authenticator
- #authorizer
- authorizer=org.apache.shiro.authz.ModularRealmAuthorizer
- permissionResolver=org.apache.shiro.authz.permission.WildcardPermissionResolver
- authorizer.permissionResolver=$permissionResolver
- securityManager.authorizer=$authorizer
- #realm
- dataSource=com.alibaba.druid.pool.DruidDataSource
- dataSource.driverClassName=com.mysql.jdbc.Driver
- dataSource.url=jdbc:mysql://localhost:3306/shiro
- dataSource.username=root
- #dataSource.password=
- jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm
- jdbcRealm.dataSource=$dataSource
- jdbcRealm.permissionsLookupEnabled=true
- securityManager.realms=$jdbcRealm
即使没接触过IoC容器的知识,如上配置也是很容易理解的:
1、对象名=全限定类名 相对于调用public无参构造器创建对象
2、对象名.属性名=值 相当于调用setter方法设置常量值
3、对象名.属性名=$对象引用 相当于调用setter方法设置对象引用
2.2、Java代码
- Factory<org.apache.shiro.mgt.SecurityManager> factory =
- new IniSecurityManagerFactory("classpath:shiro-config.ini");
- org.apache.shiro.mgt.SecurityManager securityManager = factory.getInstance();
- //将SecurityManager设置到SecurityUtils 方便全局使用
- SecurityUtils.setSecurityManager(securityManager);
- Subject subject = SecurityUtils.getSubject();
- UsernamePasswordToken token = new UsernamePasswordToken("zhang", "123");
- subject.login(token);
- Assert.assertTrue(subject.isAuthenticated());
如上代码是从Shiro INI配置中获取相应的securityManager实例:
1、默认情况先创建一个名字为securityManager,类型为org.apache.shiro.mgt.DefaultSecurityManager的默认的SecurityManager,如果想自定义,只需要在ini配置文件中指定“securityManager=SecurityManager实现类”即可,名字必须为securityManager,它是起始的根;
2、IniSecurityManagerFactory是创建securityManager的工厂,其需要一个ini配置文件路径,其支持“classpath:”(类路径)、“file:”(文件系统)、“url:”(网络)三种路径格式,默认是文件系统;
3、接着获取SecuriyManager实例,后续步骤和之前的一样。
从如上可以看出Shiro INI配置方式本身提供了一个简单的IoC/DI机制方便在配置文件配置,但是是从securityManager这个根对象开始导航。
4.2 INI配置
ini配置文件类似于Java中的properties(key=value),不过提供了将key/value分类的特性,key是每个部分不重复即可,而不是整个配置文件。如下是INI配置分类:
- [main]
- #提供了对根对象securityManager及其依赖的配置
- securityManager=org.apache.shiro.mgt.DefaultSecurityManager
- …………
- securityManager.realms=$jdbcRealm
- [users]
- #提供了对用户/密码及其角色的配置,用户名=密码,角色1,角色2
- username=password,role1,role2
- [roles]
- #提供了角色及权限之间关系的配置,角色=权限1,权限2
- role1=permission1,permission2
- [urls]
- #用于web,提供了对web url拦截相关的配置,url=拦截器[参数],拦截器
- /index.html = anon
- /admin/** = authc, roles[admin], perms["permission1"]
[main]部分
提供了对根对象securityManager及其依赖对象的配置。
创建对象
- securityManager=org.apache.shiro.mgt.DefaultSecurityManager
其构造器必须是public空参构造器,通过反射创建相应的实例。
常量值setter注入
- dataSource.driverClassName=com.mysql.jdbc.Driver
- jdbcRealm.permissionsLookupEnabled=true
会自动调用jdbcRealm.setPermissionsLookupEnabled(true),对于这种常量值会自动类型转换。
对象引用setter注入
- authenticator=org.apache.shiro.authc.pam.ModularRealmAuthenticator
- authenticationStrategy=org.apache.shiro.authc.pam.AtLeastOneSuccessfulStrategy
- authenticator.authenticationStrategy=$authenticationStrategy
- securityManager.authenticator=$authenticator
会自动通过securityManager.setAuthenticator(authenticator)注入引用依赖。
嵌套属性setter注入
- securityManager.authenticator.authenticationStrategy=$authenticationStrategy
也支持这种嵌套方式的setter注入。
byte数组setter注入
- #base64 byte[]
- authenticator.bytes=aGVsbG8=
- #hex byte[]
- authenticator.bytes=0x68656c6c6f
默认需要使用Base64进行编码,也可以使用0x十六进制。
Array/Set/List setter注入
- authenticator.array=1,2,3
- authenticator.set=$jdbcRealm,$jdbcRealm
多个之间通过“,”分割。
Map setter注入
- authenticator.map=$jdbcRealm:$jdbcRealm,1:1,key:abc
即格式是:map=key:value,key:value,可以注入常量及引用值,常量的话都看作字符串(即使有泛型也不会自动造型)。
实例化/注入顺序
- realm=Realm1
- realm=Realm12
- authenticator.bytes=aGVsbG8=
- authenticator.bytes=0x68656c6c6f
后边的覆盖前边的注入。
测试用例请参考配置文件shiro-config-main.ini。
[users]部分
配置用户名/密码及其角色,格式:“用户名=密码,角色1,角色2”,角色部分可省略。如:
- [users]
- zhang=123,role1,role2
- wang=123
密码一般生成其摘要/加密存储,后续章节介绍。
[roles]部分
配置角色及权限之间的关系,格式:“角色=权限1,权限2”;如:
- [roles]
- role1=user:create,user:update
- role2=*
如果只有角色没有对应的权限,可以不配roles,具体规则请参考授权章节。
[urls]部分
配置url及相应的拦截器之间的关系,格式:“url=拦截器[参数],拦截器[参数],如:
- [urls]
- /admin/** = authc, roles[admin], perms["permission1"]
具体规则参见web相关章节。
相关推荐
接下来,我们看 `springmvc.xml` 文件,这是 Spring MVC 的配置文件,通常在这里配置 Shiro 的 Realm,即认证和授权的实现。Realm 是 Shiro 与应用数据源交互的桥梁,你可以自定义 Realm 类,继承 `AuthorizingRealm...
但是,在Shiro中,Subject这一概念并不仅仅指人,也可以是第三方进程、后台帐户(Daemon Account)或其他类似事物。它仅仅意味着"当前跟软件交互的东西"。但考虑到大多数目的和用途,你可以把它认为是Shiro的"用户...
在整合这些技术时,首先需要在Spring的配置文件中定义bean,包括数据源、SqlSessionFactory(Mybatis的核心)、MapperScannerConfigurer(扫描Mapper接口)等。然后配置SpringMVC的DispatcherServlet,设置视图解析...
SpringMvc+Shiro配置教程 SpringMvc和Shiro是两个widely使用的Java Web开发框架,前者是一个基于模型-视图-控制器(MVC)模式的Web应用程序框架,而后者是一个基于权限控制的安全框架。将这两个框架结合使用,可以...
1. **配置 Shiro Filter**: 在 Web 应用的 `web.xml` 文件中,我们需要定义 Shiro 的 Filter。Shiro 提供了如 `AuthcFilter`(用于用户身份验证)和 `RolesAuthorizationFilter`(用于角色授权)等过滤器。通过配置...
3. **配置Spring**:在Spring配置文件中,定义Shiro的Filter Chain Definition,这将指定哪些URL需要通过Shiro过滤器进行处理。同时,需要配置Shiro的bean,如SecurityManager,SessionManager等。 4. **编写控制器...
在 Shiro 中,元数据配置是一种灵活的方式,用于定义访问控制策略。下面将详细解释 Shiro 元数据权限设置中的相关注解及其使用场景。 1. @RequiresAuthentication 这个注解用于确保在访问或调用某个类、实例或方法...
1. **配置Shiro**:在Spring或者其他的配置文件中,你需要声明并配置Shiro的相关过滤器,如`authc`(用于身份验证)、`perms`(基于权限的拦截)和`roles`(基于角色的拦截)。 2. **定义角色和权限**:在提供的`...
"跨域,shiro,swagger等Configuration配置文件.zip"这个压缩包显然包含了与这三个关键组件相关的配置文件,它们分别是:跨域(CORS)配置、Apache Shiro安全框架配置以及Swagger API文档生成工具的配置。...
1. **配置**:Shiro 的配置通常在 `shiro.ini` 或 `shiro.xml` 文件中完成,设置 SecurityManager、Realm 和其他组件。例如,定义 Realm 类型、数据源连接信息等。 2. **Web 应用集成**:对于 Web 应用,Shiro 可以...
Apache Shiro 是目前使用率较高的一个 ...第四章 集成 Web 1.Shiro 集成 Web 配置 2.Shiro 集成 Web 具体使用 3.Shiro 标签使用 4.Shiro 会话机 5.自定义 Realm 第五章 加密 1.shiro 加密解密 2.shiro 加密应用
搭建shiro的详细文档,及其代码实现。特别适合自学的人, 简单易学,一看就会。
- 在 Shiro 的 XML 配置文件中,需要定义这两个 Realm 和过滤器,并将它们添加到安全链中。配置应包括 Realm 的数据源、过滤器的执行顺序以及登录失败后的处理逻辑。 以下是一个简化版的 XML 配置示例: ```xml ...
配置applicationContext-shiro.xml 1. 配置authorizingRealm <bean id="authorizingRealm" class="com.mjm.core.interceptor.ShiroRealm"> 2.Shiro Filter 设置拦截的内容和登录页面和成功、失败页面 3.配置...
《跟我学Shiro第12章Demo:Java SE、Web与Shiro权限注解实践》 Apache Shiro是一款强大的安全框架,广泛应用于Java项目中,提供了身份验证、授权、会话管理和加密等功能。本Demo主要涵盖了Shiro在Java Standard ...
在Java项目中,通常通过创建一个`shiro.ini`配置文件或使用Java配置类来设置Shiro。配置包括以下几个主要部分: - **日志配置**:Shiro使用Log4j或SLF4J进行日志记录,需根据项目需求配置日志级别和输出位置。 - **...
SpringBoot整合Shiro后实现免密登录 1,说明一下步骤,需要在原来基础新增三...5,修改ShiroConfig文件,即Shiro配置文件,主要关注:57,63,65-90行 原文链接:https://blog.csdn.net/zlxls/article/details/105455375
Apache Shiro是一个强大且易用的Java安全框架,提供了认证、授权、会话管理和加密等功能,而Logback作为Log4j的替代品,是一款高效的日志记录框架。本文将详细介绍如何在SpringBoot项目中集成Shiro实现简单的用户...
3. **Shiro的集成**:研究如何在SpringBoot应用中配置Shiro,包括安全配置、 Realm(认证和授权信息提供者)的实现以及自定义注解的编写和使用。 4. **Shiro的权限控制**:掌握如何使用Shiro的注解进行权限判断,如@...
3. 配置 Shiro:在主配置文件(如 shiro.ini 或者 Spring 配置文件)中,设置 Realm,以及其它 Shiro 配置项,如缓存、过滤器链等。 ```ini [main] myRealm = com.example.MyRealm securityManager.realms = $...