Acegi الأمن: كيف يمكنني إضافة GrantedAuthority آخر لمصادقة مستخدم مجهول

StackOverflow https://stackoverflow.com/questions/283870

سؤال

وأعطي المستخدمين URL خاص مع مفتاح الوصول في ذلك. يجب على المستخدمين الوصول إلى الصفحة العامة عبر هذا الرابط خاص يكون قادرا على رؤية بعض بيانات إضافية بالمقارنة مع مستخدم مجهول بسيط.

وأريد أن أعطي بعض دور إضافي للمستخدم مجهول على أساس المعايير المنصوص عليها في طلب ذلك أستطيع أن أفعل شيئا من هذا القبيل في قالب بلدي:

<@sec.authorize ifAnyGranted="ROLE_ADMIN, ROLE_USER, ROLE_INVITED_VISITOR">
...some additional stuff for invited user to see
</@sec.authorize>

وحاليا انا تنفيذ OncePerRequestfilter الربيع:

protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException {
    if (null != request.getParameter("accessKey")) {
        if(isValid(request.getParameter("accessKey"))) {
            Authentication auth = SecurityContextHolder.getContext().getAuthentication();
            //how do i add additional roles to authenticated (potentially anonymous) user?
        }
    }
}
هل كانت مفيدة؟

المحلول

لماذا لا مجرد إنشاء فئة المجمع أن المندوبين إلى النص الأصلي، ولكنها تضيف على زوجين من GrantedAuthorities اضافية:

public class AuthenticationWrapper implements Authentication
{
   private Authentication original;
   private GrantedAuthority[] extraRoles;

   public AuthenticationWrapper( Authentication original, GrantedAuthority[] extraRoles )
   {
      this.original = original;
      this.extraRoles = extraRoles;
   }

   public GrantedAuthority[] getAuthorities()
   {
      GrantedAuthority[] originalRoles = original.getAuthorities();
      GrantedAuthority[]  roles = new GrantedAuthority[originalRoles.length + extraRoles.length];
      System.arraycopy( originalRoles, 0, roles, 0, originalRoles.length );
      System.arraycopy( extraRoles, 0, roles, originalRoles.length, extraRoles.length );
      return roles;
   }

   public String getName() { return original.getName(); }
   public Object getCredentials() { return original.getCredentials(); }
   public Object getDetails() { return original.getDetails(); }   
   public Object getPrincipal() { return original.getPrincipal(); }
   public boolean isAuthenticated() { return original.isAuthenticated(); }
   public void setAuthenticated( boolean isAuthenticated ) throws IllegalArgumentException
   {
      original.setAuthenticated( isAuthenticated );
   }  
}

وبعد ذلك القيام بذلك في الفلتر:

Authentication auth = SecurityContextHolder.getContext().getAuthentication();
GrantedAuthority extraRoles = new GrantedAuthority[2];
extraRoles[0] = new GrantedAuthorityImpl( "Role X" );
extraRoles[1] = new GrantedAuthorityImpl( "Role Y" );
AuthenticationWrapper wrapper = new AuthenticationWrapper( auth, extraRoles );
SecurityContextHolder.getContext().setAuthentication( wrapper );

ويتم استبدال مصادقة الآن قبل الإصدار الخاص بك مع أدوار إضافية. NB قد تضطر إلى معالجة الحالة حيث لم يتم بعد مصادقة مصادقة وذلك getAuthorities لها () إرجاع قيمة خالية. (تنفيذ المجمع يفترض حاليا أن سيكون دائما الحصول على مجموعة غير خالية من مصادقة ملفوفة لها)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top