javascript
使用Spring AOP,自定义注释和反射为您的应用审核基础架构
下一篇文章將演示如何使用Spring AOP和注釋編寫簡單的審計。 審核機制將是干凈,高效且易于維護的(和Kewwl!)。
我將在用戶管理系統上演示我的示例(假設您對反射和AOP具有一般知識)。
我們從簡單的數據庫表開始,以保??存我們的審計數據:
我們需要填充4個主要字段(用戶名,用戶類型,操作,目標用戶)
*用戶名–執行操作的用戶
* TargetUser –執行操作的目標用戶。
現在,讓我們創建新的注釋以標記我們的“想被審計”方法。 我們將非常“有創意”并使用:@AuditAble
@Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD,ElementType.TYPE}) public @interface Auditable { AuditingActionType actionType(); }帶注釋的@AuditAble方法示例:
@Override@Transactional@Auditable(actionType = AuditingActionType.INTERNAL_USER_REGISTRATION)public void createInternalUser(UserDTO userDTO) {userCreationService.createInternalUserOnDB(userDTO);}我們未來的Aspect(aop)將使用DTO從方法參數中收集一些審核數據。 在我們的情況下,將收集目標用戶名和actionType作為我們的審核信息。
為此,我創建了另一個注釋AuditingTargetUsername :
@Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD, ElementType.TYPE}) public @interface AuditingTargetUsername { String value() default ""; }因此,在UserDTO內部,我們得到了:
public abstract class UserDTO implements Serializable {@NotNull@AuditingTargetUsernameprivate String userName;...}我們用@AuditingTargetUsername注釋了userName。 該信息將在以后收集。
現在,讓我們創建AOP的方面。 此處收集并執行所有審核邏輯(攔截@Auditable方法,從批注中提取信息,使用存儲庫保存最終審核記錄):
@Aspect public class AuditingAspect {....@After("@annotation(auditable)")@Transactionalpublic void logAuditActivity(JoinPoint jp, Auditable auditable) {String targetAuditingUser;String actionType = auditable.actionType().getDescription();String auditingUsername = Authentication auth = SecurityContextHolder.getContext().getAuthentication().getName()role = userService.getCurrentUser(false).getPermissionsList().toString();auditingUsernameIp = request.getRemoteAddr();}logger.info("Auditing information. auditingUsername=" + auditingUsername + ", actionType=" + actionType + ", role=" + role + ", targetAuditingUser="+ targetAuditingUser + " auditingUsernameIp=" + auditingUsernameIp);auditingRepository.save(new AuditingEntity(auditingUsername, role, actionType, targetAuditingUser, auditingUsernameIp,new Timestamp(new java.util.Date().getTime())));}ill解釋了主要的代碼區域:
切入點–所有@ Auditable.annotations
建議–鍵入@After(我們希望在調用該方法之后進行審核)
通過帶注釋的方法的聲明檢索ActionType值:
@Auditable( actionType = AuditingActionType.INTERNAL_USER_REGISTRATION )
auditingUsername是執行操作的當前用戶(在本例中為登錄用戶)。 我是通過SecurityContext(Spring Security)檢索到的。
現在,我們將通過運行時的反射來提取@targetAuditingUser字段:
targetAuditingUser = extractTargetAuditingUser(jp.getArgs()); ...public String extractTargetAuditingUserFromAnnotation(Object obj) { ...result = getTargetAuditingUserViaAnnotation(obj);...}這就是通過反射提取帶注釋的字段的邏輯:
private String getTargetAuditingUserViaAnnotation(Object obj) { class cl=obj.getClass()String result = null;try {for (Field f : cl.getDeclaredFields())for (Annotation a : f.getAnnotations()) {if (a.annotationType() == AuditingTargetUsername.class) {f.setAccessible(true);Field annotatedFieldName = cl.getDeclaredField(f.getName());annotatedFieldName.setAccessible(true);String annotatedFieldVal = (String) annotatedFieldName.get(obj);logger.debug("Found auditing annotation. type=" + a.annotationType() + " value=" + annotatedFieldVal.toString());result = annotatedFieldVal;}}} catch (Exception e) {logger.error("Error extracting auditing annotations from obj" + obj.getClass());}return result;}DB上的結果:
而已。 我們擁有干凈的審核基礎結構,您所需要做的就是用@Auditable注釋您的方法,并在DTO /實體內部注釋所需的待審核信息。
伊丹
翻譯自: https://www.javacodegeeks.com/2014/07/auditing-infrastructure-for-your-app-using-spring-aop-custom-annotations-and-reflection.html
總結
以上是生活随笔為你收集整理的使用Spring AOP,自定义注释和反射为您的应用审核基础架构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 胸有成竹的主人公是谁(有关郑板桥胸有成竹
- 下一篇: hellokitty高清电脑壁纸(hel