web-dev-qa-db-ja.com

Spring SecurityアプリケーションでWebMvcConfigurerAdapterによって管理されるビューを含むすべてのテンプレートで現在ログインしているユーザーの情報を表示する方法

Spring SecurityとThymeleafテンプレートを使用するSpring Bootアプリケーションがあります。コントローラがWebConfigurerAdapterのサブクラスによって管理されている場合、ログインしたユーザーの名と姓をテンプレートに表示しようとしています。

だから、私のWebConfigurerAdapterサブクラスが次のようになっているとしましょう

@Configuration
public class MvcConfig extends WebMvcConfigurerAdapter{

    @Override
    public void addViewControllers(ViewControllerRegistry registry){
        registry.addViewController("/some-logged-in-page").setViewName("some-logged-in-page");
        registry.addViewController("/login").setViewName("login");

    }
    ....
}

私のユーザーエンティティクラスは次のようになります

@Entity
@Table(name = "user")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false, updatable = false)
    private Long id;



    @Column(name="first_name", nullable = false)
    private String firstName;


    public String getFirstName() {
        return firstName;
    }
    ...
}

私のテンプレートでは、次のようなコードを使用してみました

<div sec:authentication="firstName"></div> 

しかし、それはうまくいきませんでした。

私は次のようにControllerAdviseを使用することが可能であることを知っています:

@ControllerAdvice
public class CurrentUserControllerAdvice {
    @ModelAttribute("currentUser")
    public UserDetails getCurrentUser(Authentication authentication) {
        return (authentication == null) ? null : (UserDetails) authentication.getPrincipal();
    }
}

次のようなコードを使用して、テンプレートの詳細にアクセスします。

<span th:text ="${currentUser.getUser().getFirstName()}"></span>

しかし、これは私のクラスMvcConfigに登録されているビューコントローラーでは機能しません。むしろ、各コントローラーが個別のクラスであることを確認する必要があります。

したがって、ログインしたユーザーの詳細を自分のビューに自動的に挿入する方法を誰かに親切に教えてもらえますか。この例のsome-logged-in-page.html?ありがとう

6
Dee

バラジクリシュナンからのヒントのおかげで、これを達成するのは非常に簡単です。

基本的に、Thymeleaf Spring Security統合モジュールを次のようにbuild.gradleファイルに追加する必要がありました。

compile("org.thymeleaf.extras:thymeleaf-extras-springsecurity3")

次に、テンプレートで次のマークアップを使用しました:

<span th:text ="${#authentication.getPrincipal().getUser().getFirstName()}"></span>
17
Dee

Spring Security 4とThymeleaf 3を使用する場合:

<span th:text="${#authentication.getPrincipal().getUsername()}"></span>
9
B378

Spring boot 2.2.1を使用する場合。

Mavenの場合、これらの行をpom.xmlに追加します

_<dependency> <groupId>org.thymeleaf.extras</groupId> <artifactId>thymeleaf-extras-springsecurity5</artifactId> </dependency>_

胸腺に

<span th:text="${#authentication.getPrincipal().getUsername()}"></span> <span th:text="${#authentication.getPrincipal().authorities}"></span>

3
user1677230

この構成は私のために働いています(春のブート1.5と2.0/thymeleaf 3):
ここに記載されています(ページの下部) Thymeleaf + Spring Security統合の基本

Logged user: <span sec:authentication="name">Bob</span>

ビューのhtmlセクションにsecタグを含めることを忘れないでください:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
      xmlns:sec="http://www.thymeleaf.org/extras/spring-security">
<head>
</head>
<body>

これが役に立てば幸いです!
ごきげんよう!
トーマス

3
Thomas Lang

私にとって、Spring Boot 2.1.2を使用するとき、私は以下を使用する必要があります

<span th:text="${#authentication.getPrincipal()}"></span> <!-- No ".getUsername()"-->

Thymeleaf-extras-springsecurity5を使用

1
user1145691

Thymleaf 4以降では、情報を取得するためにいくつかのクラスを変更する必要があります。方法は次のとおりです。

最初に、ユーザーのゲッターgetUser(){return this.user;}をUserDetailsクラスに追加してから、そのオブジェクトをUserDetailsS​​erviceオブジェクトにプッシュします。これらの変更がないと、thymleafはHTMLファイルを解析しません。

その後、次のように情報を取得できます。

<span sec:authentication="principal.user.name">

0
Ullas Hunka

@ B378が言ったように、Spring Security 4とThymeleaf 3を使用する場合は、以下を使用する必要があります。

<span th:text="${#authentication.getPrincipal().getUsername()}"></span>

春のセキュリティはUserDetailsを内部で使用するためです。また、UserDetailsにはgetUsername()という関数が1つ含まれています。

0
Tanaji Kolekar

このページは役に立ちました。すべての返信をありがとう。最新のSpring Boot、つまりバージョン2.1.0を使用している場合は、以下を使用する必要があることに注意してください:thymeleaf-extras-springsecurity5

[〜#〜]リンク[〜#〜]

0
sunitkatkar