一. Shiro 配置文件的四大部分
在 shiro.ini 这个配置文件中, 有四个部分, [main], [users],[roles], 还有一个 [urls], 前面三个部分,我们都讲解了,只剩下一个 urls。 这儿进行讲解一下。
一. 一 [main] 部分
提供了对根对象securityManager及其依赖对象的配置。
如,前面的 jdbc 配置 和策略配置。
[main] #配置数据源 dataSource=com.mchange.v2.c3p0.ComboPooledDataSource #配置数据库的信息 dataSource.driverClass=com.mysql.jdbc.Driver dataSource.jdbcUrl=jdbc:mysql://localhost:3306/shiro?characterEncoding=utf8 dataSource.user=root dataSource.password=abc123 #配置 realm jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm #配置数据源 jdbcRealm.dataSource=$dataSource #注入多个realm 到securityManager里面 securityManager.realm=$jdbcRealm #配置验证器 authenticationStrategy=org.apache.shiro.authc.pam.FirstSuccessfulStrategy securityManager.authenticator.authenticationStrategy=$authenticationStrategy
在与 Servlet 进行整合时, [main] 部分也常常添加 如下两个部分:
authc.loginUrl=/User/toLogin roles.unauthorizedUrl=/NoPermission/NoPermission perms.unauthorizedUrl=/NoPermission/NoPermission
authc.loginUrl=/User/toLogin, 是配置没有通过认证时,跳转的页面, 通常是 登录页面
roles.unauthorizedUrl=/NoPermission/NoPermission 是没有配置要求的角色时跳转的页面, 通常是权限不足页面
perms.unauthorizedUrl=/NoPermission/NoPermission 是没有当前要求的权限时跳转的页面, 通常是权限不足页面。
一.二 [users] 部分
主要是配置用户的信息, 用户名=密码,角色1,角色2 … 角色可以省略。
[users] #用户名=密码,角色1,角色2 yuejl=1234,role1,role3 yuezl=1234,role2
一.三 [roles] 部分
主要是配置角色与权限的信息, 角色=权限1,权限2
[roles] role1=user:add,user:delete role2=user:* role3=user:select
一.四 [urls] 部分
配置 url 及相应的拦截器之间的关系, url=拦截器1[参数],拦截器2[参数]
[urls] /static/**=anon /User/toLogin=anon /User/login=anon /Main/toMain=authc /User/add=authc,perms["user:add"] /User/update=authc,perms["user:update"] /User/select=authc,perms["user:select"] /User/delete=authc,perms["user:delete"]
即 访问 /static/ 路径时, 被 anon 拦截器拦截,
访问 /Main/toMain 路径时,被 authc 拦截器拦截
访问 /User/add 路径时, 被authc 拦截器拦截,并且被拦截器 perms 拦截器 进行拦截
其中, anon, authc,perms 都是拦截器的别名缩写,分别代表着不同的功能。
二. Shiro 的拦截器
关于拦截器的详细使用,可以看 张开涛前辈写得文章: 第八章 拦截器机制——《跟我学Shiro》
Shiro 为了方便 认证和授权,提供了好多默认拦截器。
二.一 拦截器定义位置
拦截器 被定义在 org.apache.shiro.web.filter.mgt.DefaultFilter 类下。
public enum DefaultFilter { anon(AnonymousFilter.class), authc(FormAuthenticationFilter.class), authcBasic(BasicHttpAuthenticationFilter.class), logout(LogoutFilter.class), noSessionCreation(NoSessionCreationFilter.class), perms(PermissionsAuthorizationFilter.class), port(PortFilter.class), rest(HttpMethodPermissionFilter.class), roles(RolesAuthorizationFilter.class), ssl(SslFilter.class), user(UserFilter.class); ... }
前面的 anon,authc 就是别名缩写, AnonymousFilter,FormAuthenticationFilter 是其对应的拦截器类。
二.二 各个拦截器的意义
可以通过 配置文件 来做一个简单的 小Demo. 由于还没有学习自定义Realm, 故先用配置文件的形式获取数据。
三. Servlet 整合 Shiro
三.一 添加依赖
需要添加 关于 shiro 的依赖,日志的依赖,还有tomcat 的依赖。 用到了 json,需要添加 json的依赖。
<dependencies> <!--tomcat中 jsp与 servlet依赖 --> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>2.3.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <!-- jstl 与 standard 依赖--> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-all</artifactId> <version>1.2.2</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.25</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-lib</artifactId> <version>2.4</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.1</version> </dependency> <dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> <version>3.2.2</version> </dependency> </dependencies> <build> <plugins> <!-- 编译的jdk版本 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <plugin> <groupId>org.apache.tomcat.maven</groupId> <!--tomcat的插件名, tomcat7-maven-plugin, 用的是tomcat7版本 --> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <port>8080</port> <!--tomcat的端口号 --> <path>/Shiro_Web</path> <!--tomcat的项目名 --> <uriEncoding>UTF-8</uriEncoding> <!-- 防止get 提交时乱码 --> </configuration> </plugin> </plugins> </build>
三.二 配置 web.xml
需要配置监听器,配置文件的路径,添加过滤器。
<!-- 配置监听器 --> <listener> <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class> </listener> <context-param> <param-name>shiroEnvironmentClass</param-name> <param-value>org.apache.shiro.web.env.IniWebEnvironment</param-value> </context-param> <!-- 配置文件的路径 --> <context-param> <param-name>shiroConfigLocations</param-name> <param-value>classpath:shiro.ini</param-value> </context-param> <!-- 配置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>
有的教程说,1.2版本以上不用配置过滤器,但没有配置时,老蝴蝶这项目运行报错,创建securityManager 报错,添加上就没有问题了。 故老蝴蝶这儿添加上shiro 过滤器。
三.三 编写配置文件 shiro.ini
[main] #没有登录时,跳转到登录的路径 authc.loginUrl=/User/toLogin #跳转到权限不足的路径 roles.unauthorizedUrl=/NoPermission/NoPermission perms.unauthorizedUrl=/NoPermission/NoPermission # 配置用户的信息 [users] #用户名=密码,角色1,角色2 yuejl=1234,role1,role3 yuezl=1234,role2 # 定义角色的信息, 角色,权限, *表示全部的权限 [roles] role1=user:add,user:delete role2=user:* role3=user:select [urls] #静态页面可以访问 /static/**=anon #跳转到登录页面和登录方法可以访问 /User/toLogin=anon /User/login=anon #跳转到主页,需要认证 /Main/toMain=authc #执行方法,不仅需要认证,还需要有相应的方法 /User/add=authc,perms["user:add"] /User/update=authc,perms["user:update"] /User/select=authc,perms["user:select"] /User/delete=authc,perms["user:delete"] #退出登录 /User/logout=logout
由于配置文件中,用的是 key=value, 所以在访问路径时,不能用以前的 /User?jsp=toLogin, 和 /User?method=login 了。
BaseServlet 不能使用了, 需要用原始的一个方法,一个Servlet的形式了。
yuejl 没有修改的权限, yuezl 具有全部的权限。