Skip to content

L、监听器

wangjie edited this page Dec 25, 2019 · 1 revision

认证监听器AuthListener

监听用户认证和鉴权期间所发生的事件,可以基于此做日志、资源建立、资源清理等工作

public interface AuthListener {
	/**
	 * 登录成功
	 * @param request http请求
	 * @param account 账号
	 */
	void onLoginSuccess(ServletRequest request,String account);
	
	/**
	 * 登录失败
	 * @param request http请求
	 * @param account 账号
	 * @param reason  登录失败原因原因
	 */
	void onLoginFailure(ServletRequest request,String account,String reason);
	
	/**
	 * 登出
	 * @param request http请求
	 * @param account 账号
	 */
	void onLogout(ServletRequest request,String account);
	

	/**
	 * 
	 * 用户被踢出
	 * @param request http请求
	 * @param account 账号
	 * @param loginedHost 已登录HOST
	 * @param loginedTime 已登时间
	 * 
	 * 
	 * 如:账号admin在机器A登录,
	 * 再有人用admin在机器B登录,
	 * 会触发此事件,loginedHost为机器A的HOST,loginedTime为在机器A登录的时间
	 * 
	 * 
	 */
	void onKeepOneKickout(ServletRequest request,String account,String loginedHost,Date loginedTime);
	
	
	/**
	 * 
	 * 强制用户下线
	 * @param request http请求
	 * @param account 账号
	 * 
	 */
	void onForceLogout(ServletRequest request,String account);
	
	
	/**
	 * 访问断言
	 * @param request http请求
	 * @param account 账号
	 * @param needRoles 访问资源需要的角色
	 * @param allowed 是否允许访问
	 */
	void onAccessAssert(ServletRequest request,String account,String needRoles,boolean allowed);
}

Session监听器SessionListener

监听Session的生命周期

public interface SessionListener {
    /**
     * 会话开始
     */
    void onStart(Session session);

    /**
     * 会话结束
     */
    void onStop(Session session);

    /**
     * 会话过期
     */
    void onExpiration(Session session);
}

配置ShiroCustomizer

@Configuration
public class ApplicationConfig{
	// 账号数据提供服务
	@Autowired
	private AccountProviderImpl accountProviderImpl;
	// 自定义的加密实现
	//@Autowired
	//private MyDESPasswordProvider myDESPasswordProvider;
	// 自定义的验证码实现
	@Autowired
	private MyCaptchaService myCaptchaService;
	// 密码输入错误次数超限处理器
	@Autowired
	private PasswdRetryLimitHandler passwdRetryLimitHandler;
	// 鉴权规则数据提供服务
	@Autowired
	private FilteRulesProviderImpl filteRulesProviderImpl;
	// 无状态鉴权(HMAC\JWT)专用的账号数据提供服务
	@Autowired
	private StatelessAccountProviderImpl statelessAccountProviderImpl;
	// 认证监听器实现
	@Autowired
	private AuthListenerImpl1 authListenerImpl1;
	@Autowired
	private AuthListenerImpl2 authListenerImpl2;
	// session监听器实现
	@Autowired
	private SessionListenerImpl1 sessionListenerImpl1;
	@Autowired
	private SessionListenerImpl2 sessionListenerImpl2;
	
	@Bean
	public ShiroCustomizer shiroCustomizer() {
		ShiroCustomizer customizer = new ShiroCustomizer();
		// 设置账号数据提供服务
		customizer.setShiroAccountProvider(accountProviderImpl); 
		// 设置加密实现
		//customizer.setPasswordProvider(myDESPasswordProvider);
		// 设置验证码实现
		customizer.setCaptchaProvider(myCaptchaService);
		// 设置密码输入错误次数超限处理器
		customizer.setPasswdRetryLimitListener(passwdRetryLimitHandler);
		// 设置鉴权规则数据提供服务
		customizer.setShiroFilteRulesProvider(filteRulesProviderImpl);
		// 设置无状态鉴权(HMAC\JWT)专用的账号数据提供服务
		customizer.setShiroStatelessAccountProvider(statelessAccountProviderImpl);
		// 添加认证监听器
		customizer.addAuthListener(authListenerImpl1);
		customizer.addAuthListener(authListenerImpl2);
		// 添加Session监听器
		customizer.addSessionListener(sessionListenerImpl1);
		customizer.addSessionListener(sessionListenerImpl2);
		
		return customizer;
	}
}