Shiro 入门系列 二 (认证与Spring的整合)


1.Shiro的认证流程、



                                                          
                                                 SecurityManage                  -----------构造Shiro环境

                                                               |

                                                Subject.login()                     ---------------携带用户名,密码,提交认证

                                             |

                                 SecurityManage.login()               -----------------执行认证

                                                 |

                                       Authentication                      ------------------执行认证

                                                 |

                                             Realm                              -------------------通过Realm进行查询数据库进行认证




2.代码

            
       (1):首先大家都知道原始的权限控制一般都会使用拦截器来进行请求的拦截。shiro中,我们可以使用filter过滤器来拦截所有的请求,理所当然,第一步我们需要在web.xml中配置shiro的filter来进行请求的拦截。

     代码:

             

<!-- shiro过虑器,DelegatingFilterProxy通过代理模式将spring容器中的beanfilter关联起来-->

<filter>

<filter-name>shiroFilter</filter-name>

<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>

<!-- 设置trueservlet容器控制filter的生命周期-->

<init-param>

<param-name>targetFilterLifecycle</param-name>

<param-value>true</param-value>

</init-param>

<!-- 设置spring容器filterbean id,如果不设置则找与filter-name一致的bean-->

<init-param>

<param-name>targetBeanName</param-name>

<param-value>shiroFilter</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>shiroFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>


    
    (2):web容器在加载的时候会加载web.xml的各种容器,我们将shiro的filter让Spring进行管理。


代码:

<span style="font-size:18px;"><!-- 让spring管理web.xml在中配置的shiroFilter -->
	<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
		 <!-- 安全管理器 -->
        <property name="securityManager" ref="securityManager"/>
        <!-- 默认的登陆访问url -->
        <property name="loginUrl" value="/login.do"/>
        <!-- 没有权限时跳转的url -->
        <property name="unauthorizedUrl" value="/unauth.do"></property>
        <!-- 登陆成功跳转的url,如果不进行配置则访问上次访问的请求,建议不配置 
        <property name="successUrl" value="/index.do"></property>
        -->
        <!-- 请求过滤链,具体规则再最后以注释的方法说明 -->
        <property name="filterChainDefinitions">
            <value>
                /** = authc <!-- 需要认证 -->
            </value>
        </property>
	</bean>
	
	<!-- 配置shiro的安全管理器 SecurityManage -->
	<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
		<property name="realm" ref="customRealm" />
	</bean>
	
	<!-- 配置自定义的Realm -->
   <bean id="userRealm" class="com.ljy.manage.auth.relam.CustomRelam">
       <property name="credentialsMatcher" ref="credentialsMatcher" />
   </bean>

          <!-- 凭证匹配器 -->
	<bean id="credentialsMatcher"
		class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
		<property name="hashAlgorithmName" value="md5" />
		<property name="hashIterations" value="1" />
	</bean>



 

3.自定义Realm(认证代码)

/**
 * 自定义shiro Relam
 * @author LSQ
 * by QQ237442461 2016-10-7
 */
public class CustomRelam extends AuthorizingRealm{
	
	@Resource(name="userService")
	private UserService userService;
	
	@Override
	public String getName() {
		return "customRealm";
	}

	// 支持什么类型的token,选择 UsernamePasswordToken
	@Override
	public boolean supports(AuthenticationToken token) {
		return token instanceof UsernamePasswordToken;
	}

	/**
	 * 认证
	 */
	@Override
	protected AuthenticationInfo doGetAuthenticationInfo(
			AuthenticationToken token) throws AuthenticationException {
			//从token中获取用户的身份信息
			String username = (String) token.getPrincipal();
			User user = null;
			try {
				user = this.userService.queryByUserName(username);
			} catch (Exception e) {
				e.printStackTrace();
			}
			if(user == null){
				return null;
			}
			return new SimpleAuthenticationInfo(user, user.getPassword().toCharArray(), getName());
	}

	/**
	 * 授权
	 */
	@Override
	protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) {
		// TODO Auto-generated method stub
		return null;
	}
}

请大家持续关注  zlt尼玛银行 的shiro 系列,需要源码的留下秋秋
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值