рдкреНрд░рд╛рдЧрд┐рддрд┐рд╣рд╛рд╕
рд╣рдо рд╕реБрд░рдХреНрд╖рд╛ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреНрд░реЗрд▓реНрд╕ рдкрд░ рдПрдХ рдЫреЛрдЯрд╛ рдкреЛрд░реНрдЯрд▓ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рд╕реНрдкреНрд░рд┐рдВрдЧ рд╕рд┐рдХреНрдпреЛрд░рд┐рдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЧреНрд░реЗрд▓реНрд╕ рдХреЗ рд▓рд┐рдП рд╡рд╕рдВрдд-рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд▓рдЧрдЗрди рдХрд╛рдлреА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдФрд░ рдЖрдЦрд┐рд░реА рдХреНрд╖рдг рддрдХ рдЗрд╕реЗ рдЬрдЯрд┐рд▓ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдереАред
рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЧреНрд░рд┐рд▓реНрд╕ рдирд┐рдпрдВрддреНрд░рдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП @Secured рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЕрдкреНрд░рд┐рдп рдХреНрд╖рдг рдХреА рдЦреЛрдЬ рдХреА рдЧрдИ рд╣реИред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рд░рдирдЯрд╛рдЗрдо рдкрд░ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ "рдкрддрд╛ -> рдЖрд╡рд╢реНрдпрдХ рднреВрдорд┐рдХрд╛рдУрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ" рдХреЗ рд▓рд┐рдП рдирд┐рдпрдореЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдбреЗрдЯрд╛ рднрдВрдбрд╛рд░рдг / рд╡рд┐рд▓реЛрдкрди рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЧреНрд░реЗрдЧрд▓реНрд╕ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдореЗрдВ рдХрдИ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдЬрдиреНрдо рджреЗрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рдореБрдЦреНрдп URL рдкрд░ рдбреЗрдЯрд╛ рднреЗрдЬрддреЗ рд╣реИрдВ, рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рдПрдиреЛрдЯреЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред
рдпрд╣ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╣реЛрдЧрд╛ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ рд╕реБрд░рдХреНрд╖рд╛ рдирд┐рдпрдореЛрдВ рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрдкрдХрд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдПред
рд╕рдВрднрд╡ рд╕рдорд╛рдзрд╛рди
рдореБрдЭреЗ рдпрд╣ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрдпрд╛ рдХрд┐ рдЧреНрд░рд┐рд▓реНрд╕ рдХреЗ рдкреНрд▓рдЧрдЗрди рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдЗрддрдиреА рд▓рд╛рдкрд░рд╡рд╛рд╣реА рдХреНрдпреЛрдВ рдХреА, рд╢рд╛рдпрдж рдпрд╣ рдЙрдирдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл рдЖрд╕рд╛рди рдерд╛ред
рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рдорд╛рдзрд╛рди:
- рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЗ рд▓рд┐рдП AOP (рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдирд┐рдпрдореЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ)
- рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдПрдиреЛрдЯреЗрд╢рди рдмрд╛рдпреЛрдЯреЗрдХ рдХрд╛ рд╕рдВрдХрд▓рди
рдЬрд╛рд╡рд╛ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреВрд╕рд░рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЕрдкреНрд░рд┐рдп рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдЪрд░рдгреЛрдВ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЧреНрд░реВрд╡реА рдореЗрдВ рдирд╣реАрдВред рдЧреНрд░реВрд╡реА рдореЗрдВ, рдореЗрдЯрд╛-рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдпрд╛ рдПрдПрд╕рдЯреА рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдореЗрд╢рди (рдПрдмреНрд╕реНрдЯреНрд░реИрдХреНрдЯ рд╕рд┐рдВрдЯреЗрдХреНрд╕ рдЯреНрд░реА) рдЖрдорддреМрд░ рдкрд░ рдРрд╕реЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╣рдо рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрдЯрд╛-рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕реНрдерд┐рд░ рд╕рдорд╛рдзрд╛рди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╣реИрдХ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред
рдкрд░рд┐рд╡рд░реНрддрди
рд░реВрдкрд╛рдВрддрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдЧреНрд░рд┐рд▓реНрд╕ рдореЗрдВ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЙрдбрд▓ рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдЖрдИрдбреА рдФрд░ рд╕рдВрд╕реНрдХрд░рдг рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдПред рд╣рдо рдЙрдиреНрд╣реЗрдВ рдирд┐рдпрдВрддреНрд░рдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдХреЙрд▓ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рдкрд░рд┐рд╡рд░реНрддрди рдПрдХ рд╕рд░рд▓ рдЬрд╛рд╡рд╛ рд╡рд░реНрдЧ рд╣реИ рдЬреЛ ASTTransformation рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдФрд░ @GroovyASTTransformation рдХреЛ рдПрдиреЛрдЯреЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рдЬрд╝рд┐рдЯ рд╡рд┐рдзрд┐ рд╣реЛрддреА рд╣реИ - рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд┐рдЬрд╝рд┐рдЯрд░ рдкреИрдЯрд░реНрди рдХрд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╣реЛрддрд╛ рд╣реИред рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдП, рдЖрдк рдЙрд╕ рд╕рдВрдХрд▓рди рдЪрд░рдг рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕ рдкрд░ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдФрд░ рдЖрдЧрдВрддреБрдХ рдХреЛ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдиреЛрдбреНрд╕ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЧреНрд░реВрд╡рд╕реНрдЯрдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдореЗрд╢рдирдХреНрд▓рд╛рд╕ рдХреЗ рд╕рд╛рде рдПрдиреЛрдЯреЗрдЯ рдХрд┐рдП рдЧрдП рдПрдиреЛрдЯреЗрд╢рди рд╡рд░реНрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдкрд░рд┐рд╡рд░реНрддрди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЯреНрд░реА рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ, рдкрд░рд┐рдгрд╛рдореА рдмрд╛рдЗрдЯ рдХреЛрдб рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реБрдП рдиреЛрдбреНрд╕ рдХреЛ рдЬреЛрдбрд╝ / рдмрджрд▓ / рд╣рдЯрд╛ рд╕рдХрддрд╛ рд╣реИред
рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рд╣рдореЗрдВ рдХреБрдЫ рдПрдиреЛрдЯреЗрд╢рди рдФрд░ рдПрдХ рдкрд░рд┐рд╡рд░реНрддрди рд╡рд░реНрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕рд░рд▓рддрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЙрдиреНрд╣реЗрдВ @SuperSecured рдФрд░ SuperSecuredTransformation рдХрд╣рддреЗ рд╣реИрдВред
рд╕рд╛рд░рд╛рдВрд╢ рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рдПрдХ рд╕рд░рдгреА рдХрд╛ рдореВрд▓реНрдп рд╣реЛрддрд╛ рд╣реИ - рд╡рд┐рдзрд┐ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рднреВрдорд┐рдХрд╛рдПрдВред
@ рд░рд┐рдЯреЗрдВрд╢рди (RetentionPolicy.SOURCE) - рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдПрдиреЛрдЯреЗрд╢рди рдЕрдВрддрд┐рдо рдмрд╛рдпреЛрдЯреЗрдХ рдореЗрдВ рдЕрдиреБрдкрд╕реНрдерд┐рдд рд╣реЛрдЧрд╛ред
package com.example; import org.codehaus.groovy.transform.GroovyASTTransformationClass; import java.lang.annotation.*; @Target({ElementType.METHOD}) @Retention(RetentionPolicy.SOURCE) @GroovyASTTransformationClass("com.example.SuperSecuredTransformation") public @interface SuperSecured { String[] value() default {}; }
рдкрд░рд┐рд╡рд░реНрддрди:
package com.example; import org.codehaus.groovy.ast.*; import org.codehaus.groovy.ast.expr.*; import org.codehaus.groovy.ast.stmt.*; import org.codehaus.groovy.control.*; import org.codehaus.groovy.transform.*; import java.util.List; @GroovyASTTransformation(phase = CompilePhase.SEMANTIC_ANALYSIS) public class SuperSecuredTransformation implements ASTTransformation { @Override public void visit(ASTNode[] astNodes, SourceUnit sourceUnit) { if (astNodes != null) { for (ASTNode node : astNodes) { if (node instanceof MethodNode) { MethodNode methodNode = (MethodNode) node; List<AnnotationNode> annotations = methodNode.getAnnotations(new ClassNode(SuperSecured.class)); if (annotations != null && !annotations.isEmpty()) { injectRolesCheck(methodNode, annotations); } } } } } private void injectRolesCheck(MethodNode method, List<AnnotationNode> annotations) { for (AnnotationNode annotationNode : annotations) { BlockStatement code = (BlockStatement) method.getCode(); Expression rolesValue = annotationNode.getMember("value"); Expression checkRolesExpression = new StaticMethodCallExpression( new ClassNode(SuperSecuredInspector.class), "rejectByRoles", new ArgumentListExpression( rolesValue ) ); code.getStatements().add(0, new ExpressionStatement(checkRolesExpression)); } } }
рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рдХрд▓рд╛: рд░реВрдкрд╛рдВрддрд░рдг @ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдиреЛрдЯреЗрдЯ рдХрд┐рдП рдЧрдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЯреНрд░реА рдиреЛрдбреНрд╕ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ рдФрд░, рдпрджрд┐ рдпрд╣ рдПрдХ рд╡рд┐рдзрд┐ рд╣реИ, рддреЛ рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╕реНрдереИрддрд┐рдХ рд╡рд┐рдзрд┐ рдореЗрдВ рдПрдХ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝ рдЬрд╛рддрд╛ рд╣реИ SuperSecuredInspector.rejectByodoles рдПрдиреЛрдЯреЗрд╢рди рдореВрд▓реНрдп рдореЗрдВ рднреВрдорд┐рдХрд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдХреЗ рд╕рд╛рдеред рдпрд╣ рд╡рд┐рдзрд┐ рдПрдХ AccessDeniedException рдлреЗрдВрдХрддрд╛ рд╣реИ рдпрджрд┐ рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реБрд░рдХреНрд╖рд╛ рд╢рд░реНрддреЛрдВ рдХреЛ рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдЕрдВрдд рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдПрдХ рдЦреБрд╢реА рд╣реИред
рдирд┐рд╖реНрдХрд░реНрд╖
рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЖрдкрдХреЛ рд╡рд╕реНрддреБрдУрдВ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдЯрд┐рд▓ рдирд┐рдпрдореЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХреЛрдб рдореЗрдВ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рдПрдиреЛрдЯреЗрд╢рди рдХрд╛рдлреА рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ рд╣реИрдВ, рдФрд░ рдХреЛрдб рдкреАрдврд╝реА рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХреА рдЬрд╛рддреА рд╣реИ, рдЬреЛ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреА рд╣реИред
рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдореЗрд╢рди рдЧреНрд░реВрд╡реА рдореЗрдВ рдПрдУрдкреА рдХреЗ рд▓рд┐рдП рдПрдХ рдпреЛрдЧреНрдп рд╡рд┐рдХрд▓реНрдк рд╣реИред
рд╕рдВрджрд░реНрдн
PS рд╣рдм рдбреЗрд╡рд▓рдкрд░реНрд╕, рдХреГрдкрдпрд╛ рд╕реНрд░реЛрдд рдЯреИрдЧ рдореЗрдВ @ рдЪрд┐рд╣реНрди рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреА рдорд░рдореНрдордд рдХрд░реЗрдВред