1.Shiro的认证流程、
SecurityManage -----------构造Shiro环境
|
Subject.login() ---------------携带用户名,密码,提交认证
|
SecurityManage.login() -----------------执行认证
|
Authentication ------------------执行认证
|
Realm -------------------通过Realm进行查询数据库进行认证
2.代码
(1):首先大家都知道原始的权限控制一般都会使用拦截器来进行请求的拦截。shiro中,我们可以使用filter过滤器来拦截所有的请求,理所当然,第一步我们需要在web.xml中配置shiro的filter来进行请求的拦截。
代码:
<!-- shiro过虑器,DelegatingFilterProxy通过代理模式将spring容器中的bean和filter关联起来-->
<filter>
<filter-name>shiroFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<!-- 设置true由servlet容器控制filter的生命周期-->
<init-param>
<param-name>targetFilterLifecycle</param-name>
<param-value>true</param-value>
</init-param>
<!-- 设置spring容器filter的bean 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 系列,需要源码的留下秋秋