SSM框架整合Shiro后的开发

摸手教你SSM框架整合Shiro后的开发测试环境IDEA + Tomcat8 + Maven起步初始化数据库,请参考/db中的代码导入依赖导入Shiro框架需要的依赖:shiro-core-1.3.2.jarshiro-ehcache-1.3.2.jarshiro-quartz-1.3.2.jarshiro-spring-1.3.2.jarshiro-...
摘要由CSDN通过智能技术生成

摸手教你SSM框架整合Shiro后的开发

测试环境

IDEA + Tomcat8 + Maven

起步

初始化数据库,请参考/db中的代码

导入依赖

导入Shiro框架需要的依赖:

shiro-core-1.3.2.jar
shiro-ehcache-1.3.2.jar
shiro-quartz-1.3.2.jar
shiro-spring-1.3.2.jar
shiro-web-1.3.2.jar

其他依赖请参看项目中的pom.xml 文件

搭建SSM框架

SSM框架整合Shiro

环境配置

1.在web.xml中配置Shiro的过滤器

与Spring集成:

1
2
3
4
5
6
7
8
9
10
11
12
13
<filter>
    <filter-name>shiroFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    <async-supported>true</async-supported>
    <init-param>
        <param-name>targetFilterLifecycle</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>shiroFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

和SpringMVC框架类似,Shiro框架也需要在web.xml中配置一个过滤器。DelegatingFilterProxy会自动到Spring容器中name为shiroFilter的bean,并且将所有Filter的操作都委托给他管理。

这就要求在Spring配置中必须注入这样一个这样的Bean:

1
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"></bean>

此处bean的idweb.xml中Shiro过滤器的名称<filter-name>必须是相同的,否则Shiro会找不到这个Bean。

2.spring-shiro-web.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">

    <!-- Shiro的Web过滤器 -->
    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <!-- Shiro的安全管理器,所有关于安全的操作都会经过SecurityManager -->
        <property name="securityManager" ref="securityManager"/>
        <!-- 系统认证提交地址,如果用户退出即session丢失就会访问这个页面 -->
        <property name="loginUrl" value="/login.jsp"/>
        <!-- 权限验证失败跳转的页面,需要配合Spring的ExceptionHandler异常处理机制使用 -->
        <property name="unauthorizedUrl" value="/unauthorized.jsp"/>
        <property name="filters">
            <util:map>
                <entry key="authc" value-ref="formAuthenticationFilter"/>
            </util:map>
        </property>
        <!-- 自定义的过滤器链,从上向下执行,一般将`/**`放到最下面 -->
        <property name="filterChainDefinitions">
            <value>
                <!-- 静态资源不拦截 -->
                /static/** = anon
                /lib/** = anon
                /js/** = anon

                <!-- 登录页面不拦截 -->
                /login.jsp = anon
                /login.do = anon

                <!-- Shiro提供了退出登录的配置`logout`,会生成路径为`/logout`的请求地址,访问这个地址即会退出当前账户并清空缓存 -->
                /logout = logout

                <!-- user表示身份通过或通过记住我通过的用户都能访问系统 -->
                /index.jsp = user

                <!-- `/**`表示所有请求,表示访问该地址的用户是身份验证通过或RememberMe登录的都可以 -->
                /** = user
            </value>
        </property>
    </bean>

    <!-- 基于Form表单的身份验证过滤器 -->
    <bean id="formAuthenticationFilter" class="org.apache.shiro.web.filter.authc.FormAuthenticationFilter">
        <property name="usernameParam" value="username"/>
        <property name="passwordParam" value="password"/>
        <property name="loginUrl" value="/login.jsp"/>
    </bean>
    
    <!-- 安全管理器 -->
    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <property name="realm" ref="userRealm"/>
    </bean>

    <!-- Realm实现 -->
    <bean id="userRealm" class="cn.tycoding.realm.UserRealm"></bean>
</bean>

上面配置文件的核心处就是Shiro的web过滤器的配置,当然因为Shiro的所有涉及安全的操作都要经过DefaultWebSecurityManager安全管理器,所以shiroFilter首先就要将其交给SecurityManager管理。loginUrl是账户退出或者session丢失就跳转的地址;unauthorizedUrl是账户权限验证失败跳转的地址,比如账户权限不够等;然后就是过滤器链filterChainDefinitions的配置,他和我们之前配置的.ini文件非常相似,其中主要就是配置资源的的拦截。Shiro提供了很多默认的拦截器,比如什么验证,授权等,这里举例几个比较常用的默认拦截器:

默认拦截器名 说明
authc 基于表单的拦截器,比如若用户没有登录就会跳转到loginUrl的地址,其拦截的请求必须是通过登录验证的,即Subject.isAuthenticated() == true的账户才能访问
anon 匿名拦截器,和authc拦截器刚好作用相反。anon配置的请求允许用户为登录就等访问,一般我们配置登录页面和静态CSS等资源是允许匿名访问
logout 退出拦截器,Shiro提供了一个退出的功能,配置了/logout = logout,Shiro就会生成一个虚拟的映射路径,当用户访问了这个路径,Shiro会自动清空缓存并跳转到loginUrl页面
user 用户拦截器,和authc拦截器很类似,都是账户为登录的进行拦截并跳转到loginUrl地址;不同之处在于authc允许账户必须是通过Subject.siAuthenticated() ==true的;而user不仅允许登录账户访问,通过rememberMe登录的用户也能访问

Shiro实现身份认证

身份认证的流程

如果用户为登录,将跳转到loginUrl进行登录,登录表单中,包含了两个主要参数:用户名username、密码password(这两个参数名称不是固定的,但是要和FormAuthenticationFilter表单过滤器的参数配置要对应)。

  1. 用户输入这两个用户名和密码后提交表单,通过绑定了SecurityManager的SecurityUtils得到Subject实例,然后获取身份验证的UsernamePasswordToken传入用户名和密码。
  2. 调用subject.login(token)进行登录,SecurityManager会委托Authenticator把相应的token传给Realm,从Realm中获取身份认证信息。
  3. Realm可以是自己实现的Realm,Realm会根据传入的用户名和密码去数据库进行校验(提供Service层登录接口)。
  4. Shiro从Realm中获取安全数据(如用户、身份、权限等),如果校验失败,就会抛出异常,登录失败;否则就登录成功。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值