【Rails5】Administrateのスタイルシート読込先を変更する
やること
管理画面生成のgemadministrate
にてRails
のデフォルトのスタイルシートapplication.css
から、スタイルを読み込ませる方法。そんなに難しいことはしません。
方法
以下のコマンドで_styoesheet.html.erb
を生成します。これでadministrate
のデフォルト挙動のレイアウト周りを編集可能になります。
$ bin/rails generate administrate:views:layout
create app/views/layouts/admin/application.html.erb
create app/views/admin/application/_navigation.html.erb
create app/views/admin/application/_stylesheet.html.erb
create app/views/admin/application/_javascript.html.erb
create app/views/admin/application/_flashes.html.erb
こちらが生成される_stylesheet.html.erb
の中身。
# _stylesheet.html.erb <%# # Stylesheet Partial This partial imports the necessary stylesheets on each page. By default, it includes the application CSS, but each page can define additional CSS sources by providing a `content_for(:stylesheet)` block. %> <% Administrate::Engine.stylesheets.each do |css_path| %> <%= stylesheet_link_tag css_path %> <% end %> <%= yield :stylesheet %>
each
のなかに、読込先を記述します。今回であれば、デフォルトの所から呼び出すようにしたいので、application
を指定
<% Administrate::Engine.stylesheets.each do |css_path| %> <%= stylesheet_link_tag css_path %> <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> <% end %>
これで、administarte
の画面から既存のスタイルシートを読込ことができます。
私はslim
を使っているのでerb
での動作確認はできてませんが、、管理画面しか使用しないプロジェクトなどではこっちの方がいいかもしれません。
【Rails】登録内容がユニークでないユーザへの条件別対応
例えば
ユーザが電話番号で仮登録をし、認証のためのURLを生成して返す場合、同じ電話番号を使って再度仮登録の内容をPOSTしてくる場合がある。1時間以内に2回送ってくる人は恐らくイタズラに近い可能性があるのでエラーを返すが、それ以降に再度送ってきた場合、本当に認証のURLを紛失している可能性がある。
処理方法
まずPOSTされた電話番号が既に登録されているか確認する。
user = User.find_or_initialize_by(tel_number: q[:tel_number])
これで既に登録されていた場合はそのレコードを取得できる。
このレコードが新規のものか確認し、そうでないなら前回送信してから1時間経過しているかを判定する。
if !user.new_record? return raise HogeError if user.requested_at > Time.current - 60.minutes end
requested_at
は前回送信する際に保存した送信時間。もし新規レコード(初めての仮登録)ならここもパスする。
レコードを更新or保存する
user.update_attributes!( registered_url: https://hogehoge.. token: hogehoge.. requested_at: Time.current )
これで、新規登録、重複の登録に対応することが可能。
【Rails】コールバックで自分以外のレコードとユニーク判定を行う
解決
レアケースだと思いますが、バリデーションのコールバックでhoge_columns
という属性のユニーク判定をしたい場合です。特に難しいことはなく、下のようにやります。
User.where(hoge_columns:self.hoge_columns).where.not(id: self.id).empty?
本来ならuniqueness:true
をかければ良いと思いますが、色々と状態で判定を分けたかったので、こうなりました。
参考
OWASP Juice-Shop 初心者感想
Juice-Shop
OWASPから提供されているやられサイト。githubから取ってきて自分で建てて、そこで試せます。答えを見ながらもようやく完走したので、初心者目線で感想を書いてみます。
コンテンツ内容
今まで見つかったライブラリとかの脆弱性がみっちり再現されている、というわけではなく、サイトの実装不備であったり、公開されていないAPIを叩いてみたりといった、粗探しの仕方を練習できる?みたいな印象でした。ctfのエスパー問を解くに近い形のものでしょうか?実際のバグバウンティでもおそらくサイトの実装を予測して、調べるみたいな力が必要なのかなとやっていて思いました。
初心者へのフォロー
英語ですが、問題(チャレンジ)とその回答という形で、学習のフォローがされています。難易度別に問題が出されていて、それを解く形でサイトを探索し、解ければscore boardに記載され、、といった感じで進めていけるので、一人でも基本不自由なく学習を進めることができました。
bkimminich.gitbooks.io
終わってみて
勉強になりました。捜索の観点がわかったかと聞かれると、実際のサイトではどうなのかまだわからないので、イマイチ力が付いたかは体感しにくいです。ただ、ハンズオンで勉強できる機会はそうそう無いので、やってよかったと思います。
上のサイトでは、始める時にどの問題から着手すればいいのかわかりにくい(別の問題をあらかじめ解いておくのが望ましいものがあったりする)ので、その辺りは戸惑うかもしれません。おそらく、サイドバーpart2のこのページから順に上から解いていくのがいいかと思います。
終わりに
このサイトも面白そうと思ったので、内容が重複しそうな感じですが、時間があったらやってみようと思っています。 portswigger.net
【Rails】Administrateでモデルを持たないページ(Rootページ)を作成
Administrate
管理画面を簡単に作れるgemで、カスタマイズが他のものよりも容易である点が特徴っぽいです。 github.com
今回使用したバージョン
# Gemfile.lock administrate (0.11.0) administrate-field-nested_has_many (1.1.0)
トップページ
ルーティングはこのような感じで行います。root to
で指定したページが/admin
以下のルートページとして使用されるようです。
Rails.application.routes.draw do namespace :admin do resources :users resources :hoges root to: "root#index" end end
gemの特性
名前空間admin
内に指定したものが自動的にadministrate
の管轄下に置かれる?そうで、自動的にindex
ページやナビゲーションバー(他ページへのリンク)などが生成されます。便利。
しかし、このせいでモデルが準備されていないただのページを作ることができません。例えば上のルーティングはRootController#index
をたどると思うのですが、Rootなんてモデルは存在しない(作らないし)ので、エラーになります。
解消法
このエラーは、ナビゲーションバーを生成する際に起きているっぽいので、指定したモデルのみサイドバーに表示させるようにすることで回避します。
- まず、administrate
のlayoutファイルを書き出します。
$ bin/rails generate administrate:views:layout
これで生成されたうちのapp/views/admin/application/_navigation.html.erb
を編集します。(今回slimに書き換えてます。)
- each
で回している部分を表示したいモデル名のみに書き換えます。今回はベタ書きしていますが、Global
なんかで別ファイルに定義するといいと思います。下のようにします。
nav.navigation role="navigation" - ['users','hoges'].each do |resource| = link_to( ....
こうすることで、Root
なんて存在しないモデルを探索しなくなるのでエラーが出なくなりました。後は、administrate
の指定通りにController
とview
を作ってやればうまく表示されると思います。