Servlet整合Shiro(四)上

简介: Servlet整合Shiro(四)

一. 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 是其对应的拦截器类。


二.二 各个拦截器的意义


image.png


image.png


image.png


可以通过 配置文件 来做一个简单的 小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 具有全部的权限。



相关文章
|
前端开发 JavaScript Java
Servlet整合Shiro实现RBAC(七)下
Servlet整合Shiro实现RBAC(七)
168 0
Servlet整合Shiro实现RBAC(七)下
|
JSON 前端开发 数据库
Servlet整合Shiro实现RBAC(七)上
Servlet整合Shiro实现RBAC(七)
157 0
Servlet整合Shiro实现RBAC(七)上
|
前端开发 Java 数据安全/隐私保护
Servlet整合Shiro(四)下
Servlet整合Shiro(四)
145 0
Servlet整合Shiro(四)下
|
JSON 数据格式
Servlet整合Shiro(四)中
Servlet整合Shiro(四)
139 0
Servlet整合Shiro(四)中
|
3月前
|
缓存 安全 Java
Java服务器端技术:Servlet与JSP的集成与扩展
Java服务器端技术:Servlet与JSP的集成与扩展
33 3
|
3月前
|
存储 缓存 前端开发
Servlet与JSP在Java Web应用中的性能调优策略
Servlet与JSP在Java Web应用中的性能调优策略
32 1
|
3月前
|
存储 Java 关系型数据库
基于Servlet和JSP的Java Web应用开发指南
基于Servlet和JSP的Java Web应用开发指南
42 0
|
3月前
|
前端开发 安全 Java
在Java服务器端开发的浩瀚宇宙中,Servlet与JSP犹如两颗璀璨的明星,它们联袂登场,共同编织出动态网站的绚丽篇章。
在Java服务器端开发的浩瀚宇宙中,Servlet与JSP犹如两颗璀璨的明星,它们联袂登场,共同编织出动态网站的绚丽篇章。
28 0
|
5月前
|
自然语言处理 前端开发 Java
Servlet与JSP:Java Web开发的基石技术详解
【6月更文挑战第23天】Java Web的Servlet与JSP是动态网页的核心。Servlet是服务器端的Java应用,处理HTTP请求并响应;JSP则是结合HTML与Java代码的页面,用于动态内容生成。Servlet通过生命周期方法如`init()`、`service()`和`destroy()`工作,而JSP在执行时编译成Servlet。两者在MVC架构中分工,Servlet处理逻辑,JSP展示数据。尽管有Spring MVC等框架,Servlet和JSP仍是理解Web开发基础的关键。
103 12
|
5月前
|
存储 Java 关系型数据库
基于Servlet和JSP的Java Web应用开发指南
【6月更文挑战第23天】构建Java Web应用,Servlet与JSP携手打造在线图书管理系统,涵盖需求分析、设计、编码到测试。通过实例展示了Servlet如何处理用户登录(如`LoginServlet`),JSP负责页面展示(如`login.jsp`和`bookList.jsp`)。应用基于MySQL数据库,包含用户和图书表。登录失败显示错误信息,成功后展示图书列表。部署到Tomcat服务器测试功能。此基础教程为深入Java Web开发奠定了基础。
106 10