سنتحدث اليوم عن الأمان في تطبيقات الويب (وربما ليس فقط). قبل وصف الأساليب والأطر ، سوف أخبركم قليلاً عن الخلفية.
خلفية
لسنوات عديدة من العمل في مجال تكنولوجيا المعلومات ، كان علي التعامل مع مشاريع في مختلف المجالات. كان لكل مشروع متطلبات الأمان الخاصة به. إذا كان كل شيء من حيث المصادقة متماثلًا إلى حد ما من حيث المتطلبات ، فقد تبين أن طرق تنفيذ آلية التفويض مختلفة تمامًا من مشروع إلى آخر. في كل مرة ، كان يجب كتابة الإذن من الصفر تقريبًا للأهداف المحددة للمشروع ، لتطوير حل معماري ، ثم تحسينه مع المتطلبات المتغيرة ، والاختبار ، إلخ. - كل هذا عملية مشتركة لا يمكن تجنبها في التنمية. مع كل تنفيذ للنهج الهندسي التالي ، كان هناك شعور متزايد بأنك يمكن أن تأتي بنوع من النهج العام الذي يغطي الأغراض الرئيسية للترخيص ويمكن إعادة استخدامه في تطبيقات أخرى.ستنظر هذه المقالة في نهج معماري معمم للترخيص باستخدام مثال المطورالإطار .
مقاربات لإنشاء إطار عمل
كالعادة ، قبل تطوير شيء جديد ، عليك أن تقرر ما هي المشاكل التي سيتم حلها ، وكيف سيكون إطار العمل مناسبًا ومفيدًا ، وربما يوجد بالفعل حل جاهز (سنتحدث عن هذا لاحقًا).
يعرف الجميع نمطين من الترميز - إلزامي وإعلاني. يصف أسلوب بد كيف للحصول على النتيجة، ومعلن أسلوب يصف ما كنت ترغب في الحصول على نتيجة لذلك.
يعتبر النمط التقريري مناسبًا لأنه يتطلب الحد الأدنى من الجهد والوقت للإشارة إلى النتيجة المرجوة. على سبيل المثال ، بالنسبة للترخيص ، يمكن القيام بذلك في شكل وصف لأدوار المستخدم للوصول إلى المورد والأذونات وما إلى ذلك.
ومع ذلك ، فإن الأسلوب الإعلاني لا يحل جميع المشكلات (على الأقل لأغراض التفويض) ، ولا يمكنه فعل ذلك. يعتبر أسلوب الأمر مناسبًا لأنه يوفر المرونة اللازمة في التنفيذ. على سبيل المثال (في التخويل) ، كيف سيتم تنفيذ آلية تعيين الأذونات للمستخدمين - بشكل ثابت أو ديناميكي ، والتي سيعتمدون عليها.
, , . , , — . : , , — , .
:
- — , ..
- —
: ( xml, yaml, properties), java annotations.
, , :
- Java annotations java, JVM, runtime, compile time.
- , .. .
- , .. java.
:
- , ( , Admin, Viewer, Editor)
- , (permissions) ( , .. )
- , ( actions) ( ), .. , ( ) , , ( create, modify, delete). , . action-based , — , , , .
. , . .
, java annotations . — .. . Java Annotation Processing, .
Java Module System, Oracle, JDK 9, .
:
- , , , , , .. .
- (actions)
- , ()
- ( ) ()
- () — , ,
Easy-ABAC Framework
.
Spring Boot .
( maven):
<dependency>
<groupId>com.exadel.security</groupId>
<artifactId>easy-abac</artifactId>
<version>1.1</version>
</dependency>
1.1.
, :
@SpringBootApplication
@Import(AbacConfiguration.class)
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
1.
, :
:
(, , , .. — ).
:
import com.exadel.easyabac.model.core.Action;
public enum ProjectAction implements Action {
VIEW,
UPDATE,
CLOSE,
DELETE
}
- com.exadel.easyabac.model.core.Action. enum — .
, enum () , — , .
2.
- :
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface ProjectId {
}
.
:
import com.exadel.easyabac.model.annotation.Access;
import com.exadel.easyabac.model.validation.EntityAccessValidator;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
@Access(identifier = ProjectId.class)
public @interface ProjectAccess {
ProjectAction[] actions();
Class<? extends EntityAccessValidator> validator();
}
actions validator , :
Error:(13, 9) java: value() method is missing for @com.example.abac.model.ProjectAccess
Error:(13, 9) java: validator() method is missing for @com.example.abac.model.ProjectAccess
@Target({ElementType.METHOD, ElementType.TYPE})
, — instance- .
3.
:
import com.exadel.easyabac.model.validation.EntityAccessValidator;
import com.exadel.easyabac.model.validation.ExecutionContext;
import com.example.abac.model.ProjectAction;
import org.springframework.stereotype.Component;
@Component
public class ProjectValidator implements EntityAccessValidator<ProjectAction> {
@Override
public void validate(ExecutionContext<ProjectAction> context) {
// here get current user actions
// and compare them with context.getRequiredActions()
}
}
( ):
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
@Access(identifier = ProjectId.class)
public @interface ProjectAccess {
ProjectAction[] value();
Class<? extends EntityAccessValidator> validator() default ProjectValidator.class;
}
:
@ProjectAccess(value = ProjectAction.VIEW, validator = ProjectValidator.class)
4.
, :
import com.exadel.easyabac.model.annotation.ProtectedResource;
import com.example.abac.Project;
import com.example.abac.model.ProjectAccess;
import com.example.abac.model.ProjectAction;
import com.example.abac.model.ProjectId;
import org.springframework.web.bind.annotation.*;
@RestController
@ProtectedResource
@RequestMapping("/project/{projectId}")
public class ProjectController {
@GetMapping
@ProjectAccess(ProjectAction.VIEW)
public Project getProject(@ProjectId @PathVariable("projectId") Long projectId) {
Project project = ...; // get project here
return project;
}
@PostMapping
@ProjectAccess({ProjectAction.VIEW, ProjectAction.UPDATE})
public Project updateProject(@ProjectId @PathVariable("projectId") Long projectId) {
Project project = ...; // update project here
return project;
}
@PostMapping("/close")
@ProjectAccess(ProjectAction.CLOSE)
public Project updateProject(@ProjectId @PathVariable("projectId") Long projectId) {
Project project = ...; // close project here
return project;
}
@DeleteMapping
@ProjectAccess(ProjectAction.DELETE)
public Project updateProject(@ProjectId @PathVariable("projectId") Long projectId) {
Project project = ...; // delete project here
return project;
}
}
@ProtectedResource , — instance- @Access-based , — .
@PublicResource , , , @ProtectedResource
, , . , ( ).
5.
. . , , — -.
, EntityAccessValidator, validate:
public void validate(ExecutionContext<Action> context);
ExecutionContext - : context.getRequiredActions() Action, .
Action — — . Action(s) : , ...
2 Actions — , — Action — . exception, , AccessDeniedException ExceptionHandler HTTP status 403 — .
, - , , - . , , :
: Apache Shiro, JAAS, Spring Security.
Apache Shiro JAAS , , JAAS , Apache Shiro — — , ,
Spring Security — ( ), , compile-time. . , .
Easy-ABAC Framework , , — ...
, . " " .
spring-based . Spring.
.
C
- Java
- Spring-based
يناقش المقال الأساليب المعمارية للترخيص ، المقدمة من Easy-ABAC Framework.
من بين مزايا الإطار المطور:
- أسلوب التفويض التصريحي
- معالجة أخطاء التكوين في وقت الترجمة
- تكوين بسيط ومباشر
- المرونة