shiro - 配置SSL

本文介绍了如何配置SSL以实现HTTPS通信,包括使用keytool生成keystore文件,修改Tomcat的server.xml配置SSL,以及在Shiro的applicationContext-shiro.xml中进行相应设置。详细步骤和配置参数帮助读者理解SSL配置过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SSL的作用:使用https协议的证书认证。 

首先需要生成keystore文件,命令如下: keytool -genkey -keystore "d:\localhost.keystore" -alias localhost -keyalg RSA 

接下来更改tomcat的server.xml文件,改动如下:

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false"
    	sslProtocol="TLS" keystoreFile="D:\localhost.keystore" keystorePass="***"/>

 注:keystorePass值为上面设定的密钥口令。

  • port:Connector监听请求的端口号
  • protocol:Connector使用的协议
  • SSLEnabled:设定为true,表示使用SSL
  • maxThreads:并发请求处理的最大线程数。如果设定过大,将导致线程调度需要的时间过长;设定过小,将导致请求需要的时间过长。
  • schema:设定request.getSchema( )返回的字符串,对于SSL的connector,该值为https
  • secure:设定为true,表示使用ssl连接器
  • clientAuth:指定tomcat要求客户端提供有效证书
  • sslProtocol:当用ssl配置connector,使用这个属性,大多数情况值为TLS
  • keystoreFile:密钥存储文件
  • keystorePass:打开密钥存储文件,访问内部数据时的密码(自己更改)

最后是applicationContext-shiro.xml的代码添加:

    <bean id="sslFilter" class="org.apache.shiro.web.filter.authz.SslFilter">
        <property name="port" value="8443"/>
    </bean>

    <!-- Shiro的Web过滤器 -->
    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <property name="filters">
            <map>
                <entry key="ssl" value-ref="sslFilter"/>
            </map>
        </property>
        <property name="filterChainDefinitions">
            <value>
                /login.jsp = ssl
            </value>
        </property>
    </bean>

详细的applicationContext-shiro.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       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">

    <!--缓存管理器 使用Ehcache实现-->
    <bean id="cacheManager2" class="org.apache.shiro.cache.ehcache.EhCacheManager">
        <property name="cacheManagerConfigFile" value="classpath:ehcache2.xml"/>
    </bean>

    <!-- Realm实现 -->
    <bean id="userRealm" class="com.mzs.realm.UserRealm">
        <property name="cachingEnabled" value="true"/>
        <property name="authenticationCachingEnabled" value="true"/>
        <property name="authenticationCacheName" value="authenticationCache"/>
        <property name="authorizationCachingEnabled" value="false"/>
        <property name="authorizationCacheName" value="authorizationCache"/>
    </bean>

    <!-- 会话ID生成器 -->
    <bean id="sessionIdGenerator" class="org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator"/>

    <!-- 会话Cookie模板 -->
    <bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
        <property name="name" value="sid"/>
        <property name="httpOnly" value="true"/>
        <!-- cookie的生存时间,单位:秒 -->
        <property name="maxAge" value="-1"/>
    </bean>

    <bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
        <property name="name" value="rememberMe"/>
        <property name="httpOnly" value="true"/>
        <property name="maxAge" value="2592000"/>
    </bean>

    <bean id="rememberMeManager" class="org.apache.shiro.web.mgt.CookieRememberMeManager">
        <property name="cipherKey" value="#{T(org.apache.shiro.codec.Base64).decode('4AvVhmFLUs0KTA3Kprsdag==')}"/>
        <property name="cookie" ref="rememberMeCookie"/>
    </bean>

    <!-- 会话DAO -->
    <bean id="sessionDAO" class="org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO">
        <property name="activeSessionsCacheName" value="shiro-activeSessionCache"/>
        <property name="sessionIdGenerator" ref="sessionIdGenerator"/>
    </bean>

    <!-- 会话验证调度器 -->
    <bean id="sessionValidationScheduler" class="org.apache.shiro.session.mgt.quartz.QuartzSessionValidationScheduler">
        <!-- 调度时间间隔,单位:毫秒,默认值:1小时 -->
        <property name="sessionValidationInterval" value="1800000"/>
        <property name="sessionManager" ref="sessionManager"/>
    </bean>

    <!-- 会话管理器 -->
    <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
        <!-- 全局会话超时时间,默认30分钟 -->
        <property name="globalSessionTimeout" value="1800000"/>
        <!-- 删除过期的会话,默认是true -->
        <property name="deleteInvalidSessions" value="true"/>
        <!-- 会话验证调度器是否开启,默认是true -->
        <property name="sessionValidationSchedulerEnabled" value="true"/>
        <!-- 会话验证调度器,默认是ExecutorServiceSessionValidationScheduler -->
        <property name="sessionValidationScheduler" ref="sessionValidationScheduler"/>
        <!-- 会话缓存 -->
        <property name="sessionDAO" ref="sessionDAO"/>
        <!-- 是否启用创建cookie的模板,默认是true -->
        <property name="sessionIdCookieEnabled" value="true"/>
        <!-- 创建cookie的模板 -->
        <property name="sessionIdCookie" ref="sessionIdCookie"/>
    </bean>

    <!-- 安全管理器 -->
    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <property name="realms">
            <list>
                <ref bean="userRealm"/>
            </list>
        </property>
        <property name="sessionManager" ref="sessionManager"/>
        <property name="rememberMeManager" ref="rememberMeManager"/>
    </bean>

    <!-- 相当于调用SecurityUtils.setSecurityManager(securityManager) -->
    <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
        <property name="staticMethod" value="org.apache.shiro.SecurityUtils.setSecurityManager"/>
        <property name="arguments" ref="securityManager"/>
    </bean>

    <bean id="sslFilter" class="org.apache.shiro.web.filter.authz.SslFilter">
        <property name="port" value="8443"/>
    </bean>

    <!-- Shiro的Web过滤器 -->
    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <property name="securityManager" ref="securityManager"/>
        <property name="loginUrl" value="/login.jsp"/>
        <property name="successUrl" value="/jsp/loginSuccess.jsp"/>
        <property name="unauthorizedUrl" value="/jsp/unauthorized.jsp"/>
        <property name="filters">
            <map>
                <entry key="ssl" value-ref="sslFilter"/>
            </map>
        </property>
        <property name="filterChainDefinitions">
            <value>
                /index.jsp = anon
                /jsp/unauthorized.jsp = anon
                /login.jsp = ssl
                /jsp/logout = logout
                /test2.jsp = user
            </value>
        </property>
    </bean>

    <!-- Shiro生命周期处理器-->
    <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>

    <!-- 开启shiro注解 -->
    <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
        <property name="securityManager" ref="securityManager"/>
    </bean>


</beans>

ehcache2.xml 

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd" name="ehcache2">

    <diskStore path="java.io.tmpdir/ehcache"/>

    <defaultCache maxEntriesLocalHeap="10000"
                  eternal="false"
                  timeToIdleSeconds="120"
                  timeToLiveSeconds="120"
                  maxEntriesLocalDisk="10000000"
                  diskExpiryThreadIntervalSeconds="120"
                  memoryStoreEvictionPolicy="LRU">

    </defaultCache>

    <!-- 登录记录缓存 锁定10分钟 -->
    <cache name="passwordRetryCache"
           maxEntriesLocalHeap="2000"
           eternal="false"
           timeToIdleSeconds="3600"
           timeToLiveSeconds="0"
           overflowToDisk="false"
           statistics="true">
    </cache>

    <cache name="authorizationCache"
           maxEntriesLocalHeap="2000"
           eternal="false"
           timeToIdleSeconds="3600"
           timeToLiveSeconds="0"
           overflowToDisk="false"
           statistics="true">
    </cache>

    <cache name="authenticationCache"
           maxEntriesLocalHeap="2000"
           eternal="false"
           timeToIdleSeconds="3600"
           timeToLiveSeconds="0"
           overflowToDisk="false"
           statistics="true">
    </cache>

    <cache name="shiro-activeSessionCache"
           maxEntriesLocalHeap="2000"
           eternal="false"
           timeToIdleSeconds="3600"
           timeToLiveSeconds="0"
           overflowToDisk="false"
           statistics="true">
    </cache>

</ehcache>

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值