ttorubou
@ttorubou (ボウ トル)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

spring bootでアクセス制御(役職ごと) 社員管理システム

前提

まだほぼ丸投げになってしまい申し訳ありません。

さて、今回spring boot でログイン中のユーザーの給与情報を画面に一覧で表示させる。給与情報をCSV出力できる仕様と部長クラス以上の方のみ編集ボタンが押せる仕様にしたい。

質問内容

部長以上の役職の者のみ編集ボタンをアクセスできる、または編集ボタンを表示される処理をしたいのですが、うまくできません。どうしたらよいでしょうか?

環境

・postgres sql
・Thymeleaf
その他必要なものがあれば追加

該当のソースコード(Employeeテーブル)

CREATE TABLE Employee(
User_Id VARCHAR(8),
Name VARCHAR(20) NOT NULL,
Name_Kana VARCHAR(50) NOT NULL,
Password VARCHAR(100) NOT NULL,
Upn VARCHAR(50) NOT NULL,
Birthday DATE NOT NULL,
Gender INT NOT NULL,
Prefecture_Code INT,
Department_Code INT,
Entry_Date DATE NOT NULL,
Profile_Image BYTEA,
CONSTRAINT pk_employee PRIMARY KEY(User_Id),
CONSTRAINT fk_prefecturecode FOREIGN KEY(Prefecture_Code) REFERENCES Prefecture(Prefecture_Code),
CONSTRAINT fk_departmentcode FOREIGN KEY(Department_Code) REFERENCES Department(Department_Code)
);

該当のソースコード(Roleテーブル)

CREATE TABLE Role(
Role_Code VARCHAR(5),
Prefecture_Name VARCHAR(20) NOT NULL,
CONSTRAINT pk_role PRIMARY KEY(Role_Code)
);

該当のソースコード(Roleテーブルに追加した情報)

INSERT INTO Role VALUES('CEO', '代表取締役社長');

INSERT INTO Role VALUES('SMD', '専務取締役');

INSERT INTO Role VALUES('MD', '常務取締役');

INSERT INTO Role VALUES('DD', '本部長(事業部長)');

INSERT INTO Role VALUES('DM', '部長');

INSERT INTO Role VALUES('SM', '次長');

INSERT INTO Role VALUES('M', '課長');

INSERT INTO Role VALUES('D', '係長');

INSERT INTO Role VALUES('C', '主任');

INSERT INTO Role VALUES('S', '一般社員');

該当のソースコード(User_Authテーブル)

CREATE TABLE User_Auth(
User_Id VARCHAR(8),
Role_Code VARCHAR(5),
CONSTRAINT fk_userid FOREIGN KEY(User_Id) REFERENCES Employee(User_Id),
CONSTRAINT fk_rolecode FOREIGN KEY(Role_Code) REFERENCES Role(Role_Code)
);

該当のソースコード(SalaryController.java)

package com.salary.controller;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

import com.salary.entity.Salary;
import com.salary.service.SalaryService;

/**
 * ユーザー情報 Controller
 */
@Controller
public class SalaryController {

	@Autowired
	private SalaryService salaryService;

//	給与画面(ログイン画面できたら)ログイン中のユーザーIDを取得
//	@GetMapping("/")
//	public String displayList(@AuthenticationPrincipal User user, Model model) {
//		user.getId();
//		List<Salary> salaryList = salaryService.searchAll();
//		model.addAttribute("salaryList", salaryList);
//		return "html/salary_completion";
//	}

	@GetMapping("/")
	public String displayList(Model model) {
		List<Salary> salaryList = new ArrayList<Salary>();
		List<Salary> salaryListAll = new ArrayList<Salary>();
		salaryListAll = salaryService.searchAll();
		for (int i = 0; salaryListAll.size() > i; i++) {
			if (salaryListAll.get(i).getUser_id() == 1) { // user.getIdが1のところに来る
				salaryList.add(salaryListAll.get(i));
			}
		}
		model.addAttribute("salaryList", salaryList);

		return "html/salary_completion";
	}

//	給与編集画面
	@GetMapping("/salary_s")
	public String getSalary_s() {
		return "html/salary_s";
	}

//	検索&一覧
	@GetMapping("/serch&list")
	public String getSerch() {
		return "html/serch&list";
	}

}

該当のソースコード(SalaryService.java)

@Service
public class SalaryService {
	/**
	 * ユーザー情報 Repository
	 */
	@Autowired
	private SalaryRepository salaryRepository;
	
	  /**
	   * ユーザー情報 全検索
	   * @return 検索結果
	   */
	public   List<Salary> searchAll() {
		return salaryRepository.findAll();
	}
	
	/**
	   * ユーザー情報 主キー検索
	   * @return 検索結果
	   */  public  Salary findById(Integer user_id) {
	    return salaryRepository.findById(user_id).get();
	  }
	
}

  

該当のソースコード(SalaryRepository.java)

@Repository
public interface SalaryRepository extends JpaRepository<Salary, Integer> {}

該当のソースコード(Salary.java)

package com.salary.entity;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

import lombok.Data;

/**
 * ユーザー情報 Entity
 */
@Entity
@Data
@Table(name = "salary")
public class Salary implements Serializable {
	/**
	 * ユーザーID
	 */
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "user_id")
	private Integer user_id;
	/**
	 *  給与ナンバー
	 */
	@Id
	@Column(name = "salary_number")
	private String salary_number;
	/**
	 *名前
	 */
	@Column(name = "name")
	private String name;
	/**
	 * 給与
	 */
	@Column(name = "base_salary")
	private String base_salary;
	/**
	 * 税
	 */
	@Column(name = "tax")
	private String tax;
	/**
	 * 保険料
	 */
	@Column(name = "premium")
	private String premium;
	/**
	 * 交通費
	 */
	@Column(name = "carfare")
	private String carfare;
	/**
	 * 総支給額
	 */
	@Column(name = "gross_payment")
	private String gross_payment;
	/**
	 * 交付日
	 */
	@Column(name = "salary_date")
	private String salary_date;
}	

該当のソースコード(application.properties)

spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://localhost:5432/employee_db
spring.datasource.username=postgres
spring.datasource.password=0814

該当のソースコード(salary_completion.html)

<html xmlns:th="http://www.thymeleaf.org"
	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
	xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity5">
<head>
<meta charset="UTF-8">
<title>給与画面</title>
<link rel="stylesheet" th:href="@{/css/salary_completion.css}"></link>
</head>
<body>
	<div class="wrapper">
		<div class="ground">
			<div class="header">給与画面</div>
			<div th:object="${salaryDate}">
				<div class="center clearfix">
					<table class="table table-striped">
						<tr>
							<th>ID</th>
							<th>給料ID</th>
							<th>名前</th>
							<th>給与</th>
							<th>税</th>
							<th>保険料</th>
							<th>交通費</th>
							<th>総支給額</th>
							<th>交付日</th>
							<th>オプション</th>
						</tr>
						<tr th:each="salary : ${salaryList}" th:object="${salary}">
							<td th:text="${salary.user_id}"></td>
							<td th:text="${salary.salary_number}"></td>
							<td th:text="${salary.name}"></td>
							<td th:text="${salary.base_salary}"></td>
							<td th:text="${salary.tax}"></td>
							<td th:text="${salary.premium}"></td>
							<td th:text="${salary.carfare}"></td>
							<td th:text="${salary.gross_payment}"></td>
							<td th:text="${salary.salary_date}"></td>
							<td></td>
						</tr>	
					</table>
					<form action="/salary_s" method="get">
						<input sec:authorize="hasRole('ROLE_ADMIN')" type="submit"
							class="button1" value="編集">
					</form>
					<form action="/salary" method="get">
						<input type="submit" class="botton2" value="csv">
					</form>


					<div class="button clearfix">


						<form action="/serch&list" method="get">
							<button type="submit" class="footer" th:href="@{/serch&list}">検索&一覧に戻る</button>
						</form>


					</div>
				</div>
			</div>
		</div>
	</div>
</body>
</html>

該当のソースコード(SecurityConfig.java)

import org.springframework.security.config.annotation.web.builders.HttpSecurity;

public class SecurityConfig {
	// SecurityConfig.java
	protected void configure(HttpSecurity http) throws Exception {
		http.authorizeRequests().antMatchers("/css/**", "/js/**").permitAll().antMatchers("/admin/**")
				.hasAuthority("ROLE_ADMIN") // ← 【追加】
				.anyRequest().authenticated();
	}
}

0

1Answer

こんな感じでできないでしょうか。

※検証を行ったわけではないので正しく動作するかは保証できません。
※ユーザが開発者ツールを使用して値を書き換えると「編集」ボタンが表示される可能性があります。そのあたりは検証を行ったわけではないのでご注意ください。

SalaryController.java

    @Autowired
	private SalaryService salaryService;
  @Autowired
    private UserAuthService userAuthService;

	給与画面(ログイン画面できたら)ログイン中のユーザーIDを取得
	@GetMapping("/")
	public String displayList(@AuthenticationPrincipal User user, Model model) {
		int userId = user.getId();
		List<Salary> salaryList = new ArrayList<Salary>();
		List<Salary> salaryListAll = new ArrayList<Salary>();
		salaryListAll = salaryService.searchAll();
		for (int i = 0; salaryListAll.size() > i; i++) {
			if (salaryListAll.get(i).getUser_id() == userId ) { 
				salaryList.add(salaryListAll.get(i));
			}
		}
    //ログインユーザのロールID取得
        String roleCode = userAuthService.getXXXX(userId);
        boolean editButtonDisplay = false; 
    if([判定条件]){
            //部長以上の場合editButtonDisplay = true;
        }

		model.addAttribute("salaryList", salaryList);

    //true:表示する、false:表示しない
        model.addAttribute("editButtonDisplay",editButtonDisplay);
		return "html/salary_completion";
	}

salary_completion.html

<html xmlns:th="http://www.thymeleaf.org"
	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
	xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity5">
<head>
<meta charset="UTF-8">
<title>給与画面</title>
<link rel="stylesheet" th:href="@{/css/salary_completion.css}"></link>
</head>
<body>
	<div class="wrapper">
		<div class="ground">
			<div class="header">給与画面</div>
			<div th:object="${salaryDate}">
				<div class="center clearfix">
					<table class="table table-striped">
						<tr>
							<th>ID</th>
							<th>給料ID</th>
							<th>名前</th>
							<th>給与</th>
							<th>税</th>
							<th>保険料</th>
							<th>交通費</th>
							<th>総支給額</th>
							<th>交付日</th>
							<th>オプション</th>
						</tr>
						<tr th:each="salary : ${salaryList}" th:object="${salary}">
							<td th:text="${salary.user_id}"></td>
							<td th:text="${salary.salary_number}"></td>
							<td th:text="${salary.name}"></td>
							<td th:text="${salary.base_salary}"></td>
							<td th:text="${salary.tax}"></td>
							<td th:text="${salary.premium}"></td>
							<td th:text="${salary.carfare}"></td>
							<td th:text="${salary.gross_payment}"></td>
							<td th:text="${salary.salary_date}"></td>
							<td></td>
						</tr>	
					</table>
                    <span th:if="${editButtonDisplay == true}">
					  <form action="/salary_s" method="get">
						<input sec:authorize="hasRole('ROLE_ADMIN')" type="submit"
							class="button1" value="編集">
					  </form>
                    </span>
					<form action="/salary" method="get">
						<input type="submit" class="botton2" value="csv">
					</form>


					<div class="button clearfix">


						<form action="/serch&list" method="get">
							<button type="submit" class="footer" th:href="@{/serch&list}">検索&一覧に戻る</button>
						</form>


					</div>
				</div>
			</div>
		</div>
	</div>
</body>
</html>
0Like

Your answer might help someone💌