shiro安全框架 + **金融项目【安全】总结

本文详细介绍了Shiro安全框架在实际项目中的应用,包括登录认证流程、权限验证、使用Redis替代Ehcache作为缓存机制等内容。同时展示了如何结合Redis集群、Nginx负载均衡搭建高性能的SpringMVC+MyBaits项目。

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

一、**金融项目【安全】

在做**app 接口项目中,项目中使用到了shiro 做安全认证:

登录用anon

userId+imei+time加密生成令牌

//如果客户端没有上送IMEI,使用默认IMEI,为防止根据userId+imei 获取时间戳导致空指针异常
        String temp = user.getId() + "&" + (imei == null ? "" : imei);
        long time = System.currentTimeMillis() + DigitalAndStringConstant.DigitalConstant.MILLISECOND_SEVEN_DAY;
        map.put("token",
            Base64.encodeBase64String(RSAEncryptor.encryptByPublicKey((temp + "&" + time).getBytes(), publicKey)));
使用缓存存放 令牌token
loginCache.put(new Element((String)map.get("token"), user.getId()));

其他非登录需要做认证的访问均拦截

用authc,重写了拦截,不直接去认证。

1.首先判断令牌

if (StringUtils.isBlank(authentication))

2.判断 缓存

if(loginCache.get(authentication)==null)

3.判断token时间是否在有效期内

if (System.currentTimeMillis() > time)

4.再做认证

其他非登录调转第三方请求如:充值,提现。需要再次访问 另外** 项目。

做了签名验证:将请求中的参数实体加密变成 signStr签名字符串

charge.setSignStr(MD5.createMD5SignStr(charge, ConfigParametersUtil.getTransatcionMd5Key())); jsonStr = JSONUtil.toJSON(charge);

其他项目接收到该请求,获取字符串在转成实体 ,再加密,匹配验证该签名

二、shiro 安全框架

1.概述:这里使用shiro 主要是自己学习验证的 过程。因为前期做了redis 的相关研究,故而在学些shiro 的时候将官方常用的ehcache缓存用了redis替代 ,并结合redis 集群,Nginx 负载均衡,搭建了Springmvc+mybaits的框架。

redis 集群,Nginx 负载均衡前面已经做了叙述

redis替换ehcache,并使用Nginx 做负载均衡。需要完成如下两个问题:

a.session共享

b.授权信息的cache共享

http://blog.youkuaiyun.com/lishehe/article/details/45218251

/**
	 * shiro 注解验证 登录认证,权限认证
	 * @return
	 */
	@RequestMapping("/shiro1")
	@RequiresAuthentication 
	@RequiresPermissions("user:create")
	public ModelAndView Shiro1(){
		ModelAndView mv =this.getModelAndView();
		 mv.setViewName("/index");
		 return mv;
	}

2.filterChainDefinitions参数说明

 <!--   
    filterChainDefinitions参数说明,注意其验证顺序是自上而下  
    =================================================================================================  
    anon        org.apache.shiro.web.filter.authc.AnonymousFilter  
    authc       org.apache.shiro.web.filter.authc.FormAuthenticationFilter  
    authcBasic  org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter  
    perms       org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter  
    port        org.apache.shiro.web.filter.authz.PortFilter  
    rest        org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter  
    roles       org.apache.shiro.web.filter.authz.RolesAuthorizationFilter  
    ssl         org.apache.shiro.web.filter.authz.SslFilter  
    user        org.apache.shiro.web.filter.authc.UserFilter  
    =================================================================================================  
    anon: 例子/admins/**=anon 没有参数,表示可以匿名使用。  
    authc: 例如/admins/user/**=authc表示需要认证(登录)才能使用,没有参数  
    roles: 例子/admins/user/**=roles[admin],参数可以写多个,多个时必须加上引号,  
                    并且参数之间用逗号分割,当有多个参数时,例如admins/user/**=roles["admin,guest"],  
                    每个参数通过才算通过,相当于hasAllRoles()方法。  
    perms: 例子/admins/user/**=perms[user:add:*],参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,  
                    例如/admins/user/**=perms["user:add:*,user:modify:*"],当有多个参数时必须每个参数都通过才通过,  
                    想当于isPermitedAll()方法。  
    rest:  例子/admins/user/**=rest[user],根据请求的方法,相当于/admins/user/**=perms[user:method] ,  
                   其中method为post,get,delete等。  
    port:  例子/admins/user/**=port[8081],当请求的url的端口不是8081是跳转到schemal://serverName:8081?queryString,  
                   其中schmal是协议http或https等,serverName是你访问的host,8081是url配置里port的端口,queryString是你访问的url里的?后面的参数。  
    authcBasic:例如/admins/user/**=authcBasic没有参数表示httpBasic认证  
    ssl:  例子/admins/user/**=ssl没有参数,表示安全的url请求,协议为https  
    user: 例如/admins/user/**=user没有参数表示必须存在用户,当登入操作时不做检查  
    注:anon,authcBasic,auchc,user是认证过滤器,  
    perms,roles,ssl,rest,port是授权过滤器  
    =================================================================================================  
    -->  

3.shiro 注释;

http://www.cnblogs.com/lvlv/p/5104758.html

shiro.xml

<?xml version="1.0" encoding="utf-8"?>
<beans  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns="http://www.springframework.org/schema/beans" 
        xmlns:p="http://www.springframework.org/schema/p"
        xmlns:aop="http://www.springframework.org/schema/aop" 
        xmlns:cache="http://www.springframework.org/schema/cache"
        xsi:schemaLocation="http://www.springframework.org/schema/beans 
                            http://www.springframework.org/schema/beans/spring-beans-4.1.xsd 
                            http://www.springframework.org/schema/cache 
                            http://www.springframework.org/schema/cache/spring-cache-4.1.xsd
                            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd " >
                            
<!-- shrio的filter,在这里可以配置,登陆相关的页面,及对那些URL进行权限拦截权限认证 -->
    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<!-- shiro的核心安全接口 -->
        <property name="securityManager" ref="securityManager" />
<!-- 要求登录时的链接 -->
        <!-- <property name="loginUrl" value="/login.jsp" /> -->
<!-- 登陆成功后要跳转的连接 -->
        <property name="successUrl" value="/text/index" />
<!-- 未授权时要跳转的连接 -->
        <property name="unauthorizedUrl" value="/403" />
        <property name="filters">
            <map> <!-- 重写authc 接口拦截做登录验证 -->
                <!-- <entry key="authc">
                    <bean class="com.general.common.shiro.PlatformAuthenticationFilter"></bean>
                </entry> -->
            </map>
        </property>  
<!-- shiro连接约束配置 -->
        <property name="filterChainDefinitions">
            <value>
                /test/login=anon
                /test/login1=anon
                /test/loginAuth=anon
                /login=anon  
	            /test/userLogin = anon
	            /test/shiro1 = authc
                /test/redis=anon
                 /**/view/**=anon
                 /index.jsp=anon
                /**/js/**=anon
                /**/image/**=anon
                /**/css/**=anon
                /test/shiroSession=anon
                /test/shirogetSession=anon
                /test/rememberMe=user                
	            /**/* = authc 
            </value>
        </property>
    </bean>
    <!-- redis缓存 -->  
    <bean id="redisCacheManager" class="com.general.common.shiro.RedisCacheManager">
      <property name="redisUtil" ref="redisUtil" /> 
    </bean> 
     <bean id="redisCache" class="com.general.common.shiro.RedisCache">  
        <constructor-arg ref="redisUtil"></constructor-arg>  
    </bean>  
    <!--自定义Realm 继承自AuthorizingRealm-->
    <bean id="myShiroRealm" class="com.general.common.shiro.MyShiroRealm"></bean>
    <!-- shiro对ehcache的缓存管理直接使用spring的缓存工厂 -->
    <!-- <bean id="shiroEhcacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
        <property name="cacheManager" ref="ehCacheManagerFactory" />
          
    </bean> -->
    <!-- SessionDAO用shiro提供的默认实现 -->
	<bean id="sessionDAO" class="com.general.common.shiro.RedisSessionDAO"> 
	       <!-- <property name="activeSessionsCacheName" value="shiro-activeSessionCache"/> -->
	        <property name="redisUtil" ref="redisUtil" /> 
	        <!-- <property name="cacheManager" ref="shiroEhcacheManager" /> -->
	</bean>
	<bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
	  <property name="sessionDAO" ref="sessionDAO"/>
	</bean>

   <!-- 配置权限管理器 -->  
    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <property name="realm" ref="myShiroRealm" />
        <property name="sessionManager" ref="sessionManager"/>
        <!-- <property name="cacheManager" ref="shiroEhcacheManager" /> -->
        <!-- redis缓存 -->  
        <property name="cacheManager" ref="redisCacheManager" />
        <property name="rememberMeManager" ref="rememberMeManager"/> 
    </bean>
    
	<!-- Shiro生命周期处理器--> 
	<bean id="lifecycleBeanPostProcessor"
		class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />
    <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"  
      depends-on="lifecycleBeanPostProcessor" >
      <property name="proxyTargetClass" value="true" /> 
    </bean> 
    
    <!-- 开启shiro注解支持,必须在dispatcheServlet-servlet中配置,在扫描类时加入注解-->
	<!-- 开启aop,对类代理 --> 
    <!-- <aop:config proxy-target-class="true"></aop:config> -->
    <!-- <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
		<property name="securityManager" ref="securityManager" />
	</bean> -->
	<!-- shiro-RememberMe配置 -->
	<!-- 会话Cookie模板 -->  
	<bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie">  
	    <constructor-arg value="sid"/>  
	    <property name="httpOnly" value="true"/>  
	    <property name="maxAge" value="-1"/>  
	</bean>  
	<bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie">  
	    <constructor-arg value="rememberMe"/>  
	    <property name="httpOnly" value="true"/>  
	    <property name="maxAge" value="2592000"/><!-- 30天 -->  
	</bean>
	    <!-- rememberMe管理器 -->  
	   <!--  rememberMe管理器,cipherKey是加密rememberMe Cookie的密钥;默认AES算法; -->
    <bean id="rememberMeManager"   
       class="org.apache.shiro.web.mgt.CookieRememberMeManager"> 
       <property name="cipherKey" value="#{T(org.apache.shiro.codec.Base64).decode('5aaC5qKm5oqA5pyvAAAAAA==')}"/> 
        <!-- <property name="cipherKey" value="  
       #{T(org.apache.shiro.codec.Base64).decode('4AvVhmFLUs0KTA3Kprsdag==')}"/> -->  
         <property name="cookie" ref="rememberMeCookie"/>  
    </bean>
    <!-- 4AvVhmFLUs0KTA3Kprsdag== -->    
</beans>

参考:开涛---《跟我学Shiro》

http://jinnianshilongnian.iteye.com/blog/2018398

权限,用户数据库设计

http://www.cnblogs.com/lonely-buffoon/p/5580935.html

转载于:https://my.oschina.net/maoguangdong/blog/868230

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值