5

openIdプロバイダーでの認証が成功した後、ユーザーのopenId識別子に関連付けられたアカウントがデータベースにないことに気付いたときの状況に対処しようとしています。

どうすればいいのか教えてください。現在、登録フォームを表示して、ユーザーにアカウントの作成を依頼しています。ただし、ユーザー認証ステータスに問題があります。彼は現在、SpringSecurityContextクラスによって認証されていると見なされています。

「新しいユーザーページの登録」にリダイレクトする前に、コントローラーアクションでユーザーの認証を解除するにはどうすればよいですか?このアプローチは良いものですか、それとも他の方法で行う必要がありますか?

4

2 に答える 2

2

さて、サミュエルの投稿で述べられているように、認証と承認を分離することは本当に役に立ちました。ただし、まだ多くの落とし穴があり、春にはユーザーに新しい役割を追加する簡単な方法がないため、認証解除は依然として必須であることがわかりました。したがって、最も簡単な方法は、ユーザーに再度ログインを強制し、ログイン中にSpringに役割の割り当てを処理させることです。

Spring Securityでユーザーの認証を解除するには、以下を呼び出す必要があります。

SecurityContextHolder.clearContext();

別の方法として、UserDetailsS​​ervice実装で例外をスローできます(以下を参照)。ユーザーの認証を解除し、ユーザーコンテキストデータを失うという欠点があるため、新しいローカルアカウントを作成するプロセス中に、新しいユーザーアカウントをopenidアカウントと照合することは不可能です。また、ユーザーログイン後、これらのアカウントを従来のユーザー名とパスワードと一致させる必要があります。私の解決策は、新しいアカウントを作成した直後にユーザーの認証を解除することでした。

ユーザーの役割(特権)を付与するには、UserDetailsS​​erviceをオーバーライドする必要があります。誰かがこれが便利だと思った場合に備えて、これが私の実装です。

public final class MyUserDetailsService implements UserDetailsService {
    private final UsersDao usersDao;

    @Autowired
    public UserDetailsServiceImpl(final UsersDao usersDao) {
        this.usersDao = usersDao;
    }

    @Override
    public UserDetails loadUserByUsername(final String username) {      
            UserEntity user = usersDao.getUserByOpenIdIdentifier(username);
            if (user == null) {
                    // there is no such user in our db, we could here throw
                    // an Exception instead then the user would also be deuthenticated 
                    return new User(username, "", new ArrayList<GrantedAuthority>());
            }

            //here we are granting to users roles based on values from db
            final Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
            authorities.add(new SimpleGrantedAuthority(user.getUserType().toString()));

            final UserDetails result = new User(username, "", authorities);

            return result;
    }
}
于 2012-06-06T18:11:38.020 に答える
1

認証承認という2つの概念が混在しているのではないかと思います。認証はユーザーが誰であるかを知っていることであり、承認は機能のリソースへのアクセスを使用する権利です。

春のセキュリティでは、この2つの概念は、authentication-manageraccess-decision-managerによって実装されます。

ユーザーがデータベースに存在しないという事実は、ユーザーを拒否する理由ではありません。認証を取り消すことはできません。ただし、認証されたビーイングは、アクセス決定管理の基準になる可能性があります。例:AuthenticatedVoter。

認証には触れないでください。ただし、access-decision-managerをカスタマイズして、次のルールを適用してください。

  • データベースに存在するユーザーは、アカウント作成機能を除くすべてにアクセスできます
  • データベースに存在しないユーザーは、アカウント作成機能にのみアクセスできます。

これはすべて、認証ではなく、アクセス管理に関するものです。

詳細については、http://static.springsource.org/spring-security/site/docs/3.0.x/reference/ns-config.html#ns-access-managerをご覧ください。

PS:ドキュメントはSpringのセキュリティを網羅しているわけではありませんが、ソースコードは非常に読みやすくなっています。私のアドバイスは、それをチェックして、カスタマイズする必要のある要素の実装を確認することです。

于 2012-05-23T21:08:29.490 に答える