1.通知
import java.lang.reflect.Method;
import java.util.Map;
import javax.annotation.Resource;
import org.springframework.aop.AfterReturningAdvice;
import person.wjt.base.auth.model.User;
import person.wjt.base.auth.model.UserType;
import person.wjt.base.auth.runtime.AuthService;
import com.trunkbow.audit.base.dao.ManagerDao;
import com.trunkbow.audit.base.model.Manager;
public class ManagerLogin implements AfterReturningAdvice{
@Resource
private ManagerDao managerDao;
@SuppressWarnings("unchecked")
@Override
public void afterReturning(Object returnValue, Method method,
Object[] args, Object target) throws Throwable {
if (null==returnValue) {
return;
}
Map<String, Object> returnMap=(Map<String, Object>)returnValue;
User user=(User) returnMap.get(AuthService.CURRENT_USER);
if (UserType.MANAGER.equals(user.getType())) {
Manager manager=managerDao.getById(user.getId());
returnMap.put(AuthService.CURRENT_USER, manager);
}
}
}
2.service接口
/**
* 权限执行时Service
* @author wangjintao
*
*/
public interface AuthService {
/**
* 当前用户,当前登陆的用户
*/
public final static String CURRENT_USER="_current_user_";
/**
* 当前用户所属的组
*/
public final static String CURRENT_GROUPS="_current_groups_";
/**
* 当前用户可用的组
*/
public final static String CURRENT_AVAILABLE_GROUPS="_current_available_groups_";
/**
* 当前用户所属组的id
*/
public final static String CURRENT_GROUP_IDS="_current_group_ids_";
/**
* 当前用户所属组的code
*/
public final static String CURRENT_GROUP_CODES="_current_group_codes_";
/**
* 当前用户拥有的功能
*/
public final static String CURRENT_PERMS="_current_perms_";
/**
* 当前用户可用的权限
*/
public final static String CURRENT_AVAILABLE_PERMS="_current_available_perms_";
/**
* 当前用户拥有的功能id
*/
public final static String CURRENT_PERM_IDS="_current_perm_ids_";
/**
* 当前用户拥有的功能code
*/
public final static String CURRENT_PERM_CODES="_current_perm_codes_";
/**
* 登陆方法
* @param username 用户名
* @param password 密码
* @return 需要记在session中的键值对,ru
*/
public Map<String,Object> login(String username,String password);
/**
* 登出
*/
public void logout();
3.service实现
import org.apache.log4j.Logger;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.Resource;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.ExcessiveAttemptsException;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.LockedAccountException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import person.wjt.base.auth.dao.UserDao;
import person.wjt.base.auth.model.User;
import person.wjt.base.auth.runtime.AuthService;
/**
* 基于shiro的AuthService实现
* @author wangjintao
*
*/
public class ShiroAuthService implements AuthService{
/**
* Logger for this class
*/
private static final Logger logger = Logger
.getLogger(ShiroAuthService.class);
@Resource
private UserDao userDao;
@Override
public Map<String, Object> login(String username, String password) {
if (logger.isDebugEnabled()) {
logger.debug("login(String, String) - start");
}
Subject subject= SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
try{
subject.login(token);
}catch ( UnknownAccountException uae ) {
logger.warn("login(String, String)", uae);
} catch ( IncorrectCredentialsException ice ) {
logger.warn("login(String, String)", ice);
} catch ( LockedAccountException lae ) {
logger.warn("login(String, String)", lae);
} catch ( ExcessiveAttemptsException eae ) {
logger.warn("login(String, String)", eae);
} catch ( AuthenticationException ae ) {
logger.warn("login(String, String)", ae);
}
if (subject.isAuthenticated()) {
Map<String, Object> loginResult=new HashMap<String, Object>();
loginResult.put(CURRENT_USER,subject.getPrincipals().oneByType(User.class));
return loginResult;
}
if (logger.isDebugEnabled()) {
logger.debug("login(String, String) - end");
}
return null;
}
@Override
public void logout() {
Subject subject= SecurityUtils.getSubject();
if (null!=subject&&subject.isAuthenticated()) {
subject.logout();
}
}
}
2.配置
<bean id="authServiceImpl" class="person.wjt.base.auth.runtime.shiro.ShiroAuthService" />
<bean id="managerLoginAdvisor"
class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<property name="advice" ref="managerLogin" />
<property name="mappedNames">
<array value-type="java.lang.String">
<value>login</value>
</array>
</property>
</bean>
<bean id="authService" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces" value="person.wjt.base.auth.runtime.AuthService" />
<property name="target" ref="authServiceImpl" />
<property name="interceptorNames">
<list>
<value>managerLoginAdvisor</value>
</list>
</property>
</bean>
分享到:
相关推荐
基于注解实现SpringAop基于注解实现SpringAop基于注解实现SpringAop
使用Spring的注解方式实现AOP的细节
NULL 博文链接:https://zhang-yingjie-qq-com.iteye.com/blog/319927
演示了spring基于AOP代理TransactionProxyFactoryBean实现事务
Spring-Aop源码实现
Spring中实现AOP有很多方式,这里总结了四种,有基于代理的实现方式,也有基于AspectJ 的注解方式,还有基于AOP标签的配置
里面包括4个例子:(1)Spring实现AOP方式之一:基于XML配置的Spring AOP (2)Spring实现AOP方式之二:使用注解配置 Spring AOP (3)Spring AOP : AspectJ Pointcut 切点 (4)Spring AOP : Advice 声明 (通知注解)
Spring实现AOP的4种方式
Spring AOP的实现机制中文版,动态代理及原理,自定义类加载器
spring boot AOP注解方式实现多数据源整合(从零开始搭建框架到配置多数据源实践小例子)
spring_AOP实现方法大全spring_AOP实现方法大全
使用Spring的AOP技术,实现日志记录功能。记录如下信息: 在哪个时间访问了哪个方法,方法传入了哪些参数
初探spring aop内部实现 、从源代码解读spring之DataSource实现和FactoryBean模式
在Spring1.2或之前的版本中,实现AOP的传统方式就是通过实现Spring的AOP API来定义Advice,并设置代理对象。Spring根据Adivce加入到业务流程的时机的不同,提供了四种不同的Advice:Before Advice、After Advice、...
AOP的意思就是面向切面编程。本文主要是通过梳理JDK中自带的反射机制,实现 AOP动态代理模式,这也是Spring AOP 的实现原理
Spring的AOP实现的日志功能案例.zip Spring的AOP实现的日志功能案例.zip Spring的AOP实现的日志功能案例.zip Spring的AOP实现的日志功能案例.zip Spring的AOP实现的日志功能案例.zip Spring的AOP实现的日志功能案例....
以注解方式模拟Spring IoC AOP,了解Spring是如何实现的.
spring作为一个aop框架,能轻松实现面向切面编程,本例演示如何使用spring进行面向切面编程。
一个基于配置文件的Spring AOP的实现。实现了前置通知,后置通知,以及拦截器的功能,配置中有详细的注释。
使用Spring配置文件实现AOP