2013-10-09 5 views
2

Я не могу получить наши тесты, чтобы передать атрибут RequiredPermission в нашем сервисе ServiceStack. Может ли кто-нибудь помочь мне выяснить, где я ошибаюсь?ServiceStack RequiredPermission не подтверждает моего пользователя

Предполагается, что RequiredPermission использует список session.Permissions.

Наша UserViewModel настроен следующим образом

public class UserViewModel : ViewModelBase 
{ 
    public UserViewModel() 
    { 
     Groups = new List<GroupModel>(); 
    } 

    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Email { get; set; } 
    public string Password { get; set; } // This should never be populated on the way out. 

    public IList<GroupModel> Groups { get; set; } 
} 

GroupModel похож со списком SecuritySettings в нем. Каждый вызов Service Layer возвращает полностью гидратированный UserViewModel, содержащий список групп, и каждая группа содержит список SecuritySettings.

Когда пользователь Идентифицирует, мы запускаем этот

public override void OnAuthenticated (IServiceBase authService, 
              IAuthSession session, 
              IOAuthTokens tokens, 
              Dictionary<string, string> authInfo) 
    { 
     session.Id = _userViewModel.Id.ToString(); 
     session.UserName = _userViewModel.Email; 
     session.FirstName = _userViewModel.FirstName; 
     session.DisplayName = string.Format("{0} {1}", _userViewModel.FirstName, _userViewModel.LastName); 

     session.Roles = new List<string>(); 
     session.Permissions = new List<string>(); 

     if (_userViewModel.Groups != null) 
     { 
      foreach (var group in _userViewModel.Groups) 
      { 
       // Add user Groups to "Roles" 
       session.Roles.Add(group.Name); 

       if (@group.SecuritySettings == null) continue; 
       foreach (var securitySetting in @group.SecuritySettings) 
       { 
        // Add group SecuritySettings to "Permissions" 
        session.Permissions.Add(securitySetting.Name); 
       } 
      } 
     } 

     var mapper = new AutoMapper<UserModel>(); 
     _container.Register(mapper.BuildFrom(_userViewModel)); 

     //Important: You need to save the session! 
     authService.SaveSession(session, SessionExpiry); 
    } 

Проблема у меня в том, что мои тесты все еще возвращаются «Несанкционированное» на моем методе UserServiceInterface

[RequiredPermission("Read User")] 
    public object Get(UserRequest request) 
    { 
     return new UserResponse { User = _userService.GetById(request.Id) }; 
    } 

Я могу подтвердить, что UserViewModel.Groups[0].SecuritySettings[0].Name == "Read User".

ответ

1

Решение этой проблемы заключается в вызове метода base.OnAuthenticated в конце метода CustomCredentialsAuthProvider.OnAuthenticated.

public override void OnAuthenticated (IServiceBase authService, 
              IAuthSession session, 
              IOAuthTokens tokens, 
              Dictionary<string, string> authInfo) 
    { 

     // truncated for brevity 

     //Important: You need to save the session!s 
     authService.SaveSession(session, SessionExpiry); 

     // THIS ENSURES THE SESSION IS ACCESSABLE BY THE APP 
     base.OnAuthenticated(authService, session, tokens, authInfo); 
    } 
0

Вот реализация RequiredPermissionAttribute: реализация

public bool HasAllPermissions(IAuthSession session) 
{ 
    return this.RequiredPermissions 
     .All(requiredPermission => session != null 
      && session.HasPermission(requiredPermission)); 
} 

по умолчанию, который просто проверяет AuthUserSession.HasPermission(), то есть:

public virtual bool HasPermission(string permission) 
{ 
    return this.Permissions != null && this.Permissions.Contains(permission); 
} 

Что переопределение, если вы используете CustomAuthSession. Я бы рекомендовал переопределить HasPermission() и поставить точку останова, чтобы вы могли инспектировать свой экземпляр сеанса - поскольку текущее поведение не срабатывает, когда сеанс не имеет требуемого разрешения.

+0

Я только что нашел проблему. Добавление 'base.OnAuthenticated (authService, session, tokens, authInfo);' мой метод OnAuthenticated' передавал данные сеанса туда, куда ему нужно было идти. –

+0

@ChaseFlorell отличный, хороший материал! – mythz

+0

Спасибо за вашу помощь и за создание такого замечательного продукта. –

Смежные вопросы