質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

1回答

1239閲覧

山田先生の学生のみ表示したい(今ほかの先生の学生も、権限がない情報も入手される)

soso_sho

総合スコア11

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2017/10/11 04:44

編集2017/10/11 07:29

###前提・実現したいこと
Eclipseでjavを使い、
ログイン中の山田先生が自分の学生成績リストを表示したい。

###発生している問題・エラーメッセージ

ログイン中の山田先生以外の田中先生の学生もリストに表示されている。
ようには先生ごとに分けてもらいたい。
ようには山田先生は承認権限が無い情報(ほかの学生)を見れてるため、よくないのです。

###該当のソースコード

java

1 /** 承認社員を検索します。 */ 2 @GetMapping("/teacher") 3 public List<StudentInfo> findTeacher() { 4 return service.findTeacher().stream() 5 .map(StudentInfo::of) 6 .collect(Collectors.toList()); 7 } 8 9 /** 学生を検索します。 low: 先生権限のみ利用可能に */ 10 @GetMapping 11 public List<StudentInfo> findStudent() { 12 return service.findStudent().stream() 13 .map(StudentInfo::of) 14 .collect(Collectors.toList()); 15 } 16 17 @Data 18 @NoArgsConstructor 19 @AllArgsConstructor 20 public static class StudentInfo implements Dto { 21 private static final long serialVersionUID = 1L; 22 /** 学生ID */ 23 private String id; 24 /** 学生氏名 */ 25 private String name; 26 /** フリガナ */ 27 private String kana; 28 /** 先生フラグ */ 29 private boolean teacherFlag; 30 /** 権限一覧 */ 31 private Set<GroupType> groups = new HashSet<>(); 32 33 public static StudentInfo of(Student m) { 34 return of(m, new HashSet<>()); 35 } 36 37 public static StudentInfo of(Student m, Collection<GroupType> groups) { 38 StudentInfo p = new StudentInfo(); 39 p.id = m.getId(); 40 p.name = m.getName(); 41 p.kana = m.getKana(); 42 p.teacherFlag = m.isTeacherFlag(); 43 p.groups.addAll(groups); 44 return p; 45 } 46 } 47}

###試したこと
以前、UI側で

html

1li.list-group-item.l-selectable(v-for="item in unapproved", v-if="item.approverName === sessionValue().name", @click="showApproveDetail(item)")

v-ifはログインアカウントと先生(teacher)を判別するために用います。
v-forで先生権限がない情報でも見れています。それに加えてv-ifを使い、v-forの内容を分岐して、
ログイン中の方のnameは先生のnameと一致すれば、
該当するリストが表示されますが、
じゃなければ、表示させません。という考えです。
だが、HTTPの通信ログは見れるわけですから、ある意味、セキュリティ上の脆弱性になります。そのため、API側だけで 既存のAPIを書き換えたり、新たに作ったりして、そこのAPIでログインしているアカウントが先生となる一覧を返したいのです。

###補足情報(言語/FW/ツール等のバージョンなど)
他の学生の情報を見れるのは良くないから、APIのみ処理したいのであれば、どうすればよいのでしょうか。

追加:

java

1 /** 学生を検索します。 low: 先生権限のみ利用可能に */ 2 @GetMapping 3 public List<StudentInfo> findStudent() { 4 5 studentInfoList = null; 6 List<StudentInfo> StudentAll = service.findStudent().stream() 7 .map(StudentInfo::of) 8 .collect(Collectors.toList()); 9 10 for (StudentInfo studentInfo : StudentAll) { 11 12 if (studentInfo.equals(teacherId)) { 13 studentInfoList.add(studentInfo); 14 } 15 } 16 return studentInfoList; 17 }

上記のように、StudentController.javaファイルにループforとif文を使ってみましたが、うまくいかない。
もしかしたら、どこかに書き間違えていますか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2017/10/11 07:35

「HTTPの通信ログは見れるわけですから、ある意味、セキュリティ上の脆弱性になります」とありますが、その状態で山田先生の生徒だけ返すようにしたとしても、脆弱なことに変わりはないのではないでしょうか?
soso_sho

2017/10/11 07:41

脆弱なことをおいといて、ひとまずAPIでこの問題を解消できるのでしょうか。
guest

回答1

0

ベストアンサー

良くわかんないんですけど、ようはコントローラーにあるfindStudentメソッドが
ログイン中の先生の学生だけを返せればいいんでしょうか?

まず、service.findStudent()ですけど、
引数に先生IDを渡してSQLの条件に入れてみてはどうでしょう?

とりあえず今は、どうしても全生徒を取得してJavaの以下の処理で絞りたいとしましょう。

Java

1for (StudentInfo studentInfo : StudentAll) { 2 if (studentInfo.equals(teacherId)) { 3 studentInfoList.add(studentInfo); 4 } 5}

この上記の処理なんですけど、teacherIdってなんですか?
StudentInfoとequalsしてますけど、teacherIdはStudentInfoなんですか?
StudentInfoは@Dataアノテーションがついている以外、
特別なequalsのオーバーライドもありませんし、ここが間違ってる可能性はないでしょうか?

StudentInfo.getTeacherId().equals(teacherId)
みたいな感じではないかと推測されるんですけど、
StudentInfoにteacherIdらしきものもありませんね。

あと、これは別件ですけど、Stream API使うならこのfor文の部分も一緒に書いてはどうでしょう?

Java

1List<StudentInfo> studentInfoList = service.findStudent().stream() 2 .filter(ここで絞る) 3 .map(StudentInfo::of) 4 .collect(Collectors.toList()); 5return studentInfoList;

投稿2017/10/11 08:37

root_jp

総合スコア4666

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

soso_sho

2017/10/11 10:29

ご回答有り難うございます。 if (studentInfo.equals(teacherId))のところで、書き間違えていると気づかなかった。 正しいソースはif (teacherId.equals(ログイン中のuseId)) ログイン中のユーザーID(先生のID)は該当するteacherIdと等しい場合には、 この先生の生徒だけの情報を返すべきであること。 ですが、ユーザーIDとteacherIDを定義してないので、ここのファイルに定義するか。 それともすでに別のどこかファイルに入ってるかわかりません。 もし、他のファイルにすでにユーザーIDを定義していれば、 どういうふうにできるのでしょうか。 そして、今の補足内容を踏まえて、 .filter(ここで絞る)の括弧にfor文だけで良いのでしょうか。 あるいは具体的なソースを書いていただけないのでしょうか。
root_jp

2017/10/11 10:56 編集

StudentにはteacherIdはあるんでしょうか? データモデリング的におかしい気がしますが、とりあえず今はあるとします。 そうすると以下のように書くことができます。 List<StudentInfo> studentInfoList = service.findStudent().stream() .filter(s -> s.getTeacherId().equals(LoginUser.getId())) .map(StudentInfo::of) .collect(Collectors.toList()); return studentInfoList;
soso_sho

2017/10/11 14:28

StudentにはteacherIdは無い場合には、どうなりますでしょうか。
root_jp

2017/10/12 04:22

クイズじゃないんだから、teacherIdの居場所を教えてくださいよww まぁ、StudentにteacherIdがないのでは、そもそも絞りようがないですね。 例えば出席番号や性別(Studentが持ってない情報)で絞りたいですって言ってるのと同じなので。
soso_sho

2017/10/12 09:44

よく勉強になりました。 この度ありがとうございます。 今後ともよろしくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問