2016-06-06 3 views
4

누구나 question에서 제안 된대로 int RefId를 사용하는 방법에 대한 실제 예제가 있습니까?ServiceStack 사용자 정의 사용자 인증

인증을 받으려고하지만 userAuth 데이터를 내 사용자 테이블과 결합해야합니다. 문제는 "/ register"메서드에 추가 매개 변수를 전달하는 방법을 모른다는 것입니다. 나는 "OnAddUser"와 같은 이벤트를 찾고 있는데 믹스에 몇 가지 추가 매개 변수를 던질 수 있습니다.

사용자 등록이 매우 신속하게 처리 될 수 있었지만 매우 쉬웠습니다. 어쩌면 문제는 너무 쉽다는 것입니까? 나는 그것이 작동하는 것을 볼 수는 있지만 나는 그것과 데이터베이스 사이의 관계를 이해할 수 없다.

사전 접근법이나 RefId 접근법이 아마도 저에게 효과적 일 수 있습니다. 사용 방법도 분명하지 않습니다.

생성 사용자를 모두 무시할 수 있습니까? 이 코드 발견 :

MyServices.cs을

은 "/ 등록"하지만 당신은 ServiceStack DTO들을 재정의 할 수 없습니다 제안 다른 기사가 대신 사용자 만들기를하고있는 것처럼 보이는

, 당신에게 기본 테이블을 사용해야합니다.

답변

2

RegisterService 소스 코드 사본을 사용하여 사용자 등록 서비스를 포함하고 필요에 맞게 수정할 수 있습니다. 원하는 추가 특성을 가진 사용자 정의 Register DTO을 사용하십시오.

그러나 당신은 쉽게 당신이 당신의 서비스 내에서 액세스 할 수있는 이는 ?querystring에 추가하여 기존 등록 DTO를 변경하지 않고 추가 PARAMS을 전달할 수 있습니다 등록 중에 사용자 정의 로직 추가

var myParam = base.Request.QueryString["myParam"]; 

그렇지 않으면 방법 또는 인증은 기존 Session or Auth Events에 접속하는 것입니다. 그들이 GitHub의이나 트위터를 통해 로그인 할 때 사용자의 프로필 URL을 가져옵니다

public class CustomUserSession : AuthUserSession 
{ 
    public string DefaultProfileUrl { get; set; } 

    public string GithubProfileUrl { get; set; } 
    public string TwitterProfileUrl { get; set; } 

    public override void OnAuthenticated(IServiceBase authService, 
     IAuthSession session, 
     IAuthTokens tokens, 
     Dictionary<string, string> authInfo) 
    { 
     base.OnAuthenticated(authService, session, tokens, authInfo); 
     var appSettings = authService.TryResolve<IAppSettings>(); 
     var userAuthRepo = authService.TryResolve<IAuthRepository>(); 
     var userAuth = userAuthRepo.GetUserAuth(session, tokens); 
     var dbConnectionFactory = authService.TryResolve<IDbConnectionFactory>(); 
     foreach (var authTokens in session.ProviderOAuthAccess) 
     { 
      if (authTokens.Provider.ToLower() == "github") 
      { 
       GithubProfileUrl = session.GetProfileUrl(); 
      } 
      if (authTokens.Provider.ToLower() == "twitter") 
      { 
       TwitterProfileUrl = session.GetProfileUrl(); 
       if (appSettings.GetList("TwitterAdmins").Contains(session.UserName) 
        && !session.HasRole(RoleNames.Admin)) 
       { 
        userAuthRepo.AssignRoles(userAuth, roles:new[]{RoleNames.Admin}); 
       } 
      } 

      DefaultProfileUrl = GithubProfileUrl ?? TwitterProfileUrl; 
      using (var db = dbConnectionFactory.OpenDbConnection()) 
      { 
       var userAuthInstance = db.Single<CustomUserAuth>(x => 
        x.Id == this.UserAuthId.ToInt()); 
       if (userAuthInstance != null) 
       { 
        userAuthInstance.DefaultProfileUrl = this.DefaultProfileUrl; 
        db.Save(userAuthInstance); 
       } 
      } 
     } 
    } 
} 

:

TechStacks는 CustomAuthUserSession이의 예를 가지고있다. 관리자 역할을 TwitterAdminsAppSetting의 사용자에게 할당합니다. 이는 알려진 트위터 사용자에게 관리자 권한을 할당하는 방법입니다. 마지막으로 검색된 프로필 URL이 CustomUserAuth POCO 테이블에 추가되어 저장됩니다.

TechStacks은 registering a generic OrmLiteAuthRepository에 의해 대신 자신의 CustomUserAuth 테이블을 사용하는 ServiceStack을 알려줍니다

var authRepo = new OrmLiteAuthRepository<CustomUserAuth, UserAuthDetails>(dbFactory); 
container.Register<IUserAuthRepository>(authRepo); 
authRepo.InitSchema(); 

지금 대신 기본 UserAuth 테이블의 CustomUserAuth에서 사용자 정보를 저장합니다 곳.

+1

전에 비슷한 코드를 보았지만 여기서 제시 한 방식을 보았을 때까지는 나에게 이해가되지 않았습니다. 당신의 도움을 주셔서 감사합니다. ServiceStack은 멋진 기능입니다 ... – user2033791

+1

작은 업데이트 ... RefFI를 업데이트하기 위해 데이터베이스 트리거를 사용했습니다. 그게 잘 작동하는 것 같아요 그리고 내가 이미 쉽게 Servicestack 인증 루틴을 사용하자. – user2033791

관련 문제