前提となるModelの構造
TodoMODELの構造
public class Todo
{
public int Id { get; set; }
public string Sammary { get; set; }
public string Detail { get; set; }
public DateTime Limit { get; set; }
public bool Done { get; set; }
public virtual User User { get; set; }
}
TodoModelには、IDがあります。
また概要と詳細があり、期限と完了フラグがあります。
UserModelの構造
public class User
{
public int id { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public virtual ICollection<Todo> todoes { get; set; }
}
こちらもシンプルにUserIDとNameとPassword。そして、Todoを複数持っているといった感じですね。
Detailsでログイン中ユーザーの情報を取ってみる!
ここでは、スキャフォールドで作成してくれるDetailsをみていきます!
// GET: Todoes/Details/5
public ActionResult Details(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Todo todo = GetLoginUser().Todoes.FirstOrDefault(c => c.Id == id);
if (todo == null)
{
return HttpNotFound();
}
return View(todo);
}
基本的にはスキャフォールドすると上記のようにidを引数にしてますね!
idがnullだったら、バッドリクエストを返します。
この箇所は私が書いた箇所です。
Todo todo = GetLoginUser().Todoes.FirstOrDefault(c => c.Id == id);
GetLoginUser()の中身は下記のようになっています。
private User GetLoginUser()
{
return db.Users.FirstOrDefault(u => u.UserName == User.Identity.Name);
}
単純にログインユーザーをユーザーテーブルから取得するッといった感じですね。
さっきのコードと合わせてみてみると下記のようになります。
var User = db.Users.FirstOrDefault(u => u.UserName == User.Identity.Name);
Todo todo = User.Todoes.FirstOrDefault(c => c.Id == id);
DBからユーザー情報を取得し、そのユーザーのに紐づいているTodoの中から引数にあるidのTodoを引っ張ってきているといった感じですね!
Detailsでもログイン中ユーザーの情報を取得する必要がある?
ここで疑問になるのが、Detailsはidを引数に、Todoを探して表示するといった挙動なのに、わざわざユーザーを絞って表示する必要があるのか?
という点です。
Indexは全情報を表示するので、その中からログインユーザーの情報のみというのはわかる話ですが、Detailsの場合idを直接していするのに必要?ってなりますよね。
はい。必要です。
例えば、URL直打ちされた場合はどうなるのでしょう?
今回TodoesController全体にAuthorizeアノテーションを付けてるので、ログインしている状態でしか情報が見れません。
ですが、スキャフォールドで作成したまんまで使うと、ログインしていれば誰でも情報は見れるようになります。
例えば下記のような場合。
- a => idが1,2のレコードを保持
- b => idが3,4のレコードを保持
こうなっていた場合、Detailsのパスは下記のようになります。
- http://localhost/プロジェクト名/Todo/Details/1~4のid
aさんがログインした状態で、Url直打ちで3 or 4 のidを入れたとすると?
ログインユーザーの情報のみに絞っていないと、見ることができます。
これは大問題!
ということで、Detailsでも忘れずにログインユーザーの情報のみに絞るということを忘れないようにしましょう。
コメント