Aug 27

Struts2 でアプリを作っていて、Interceptor を使おうとしたら、めちゃはまった・・・

public class AuthenticationInterceptor extends AbstractInterceptor {

	private static final long serialVersionUID = 1L;

	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		Map<String, Object> session = ActionContext.getContext().getSession();
		Boolean auth = (Boolean)session.get(AuthenticationAction.AUTH_KEY);
		if (null == auth || !auth.booleanValue()) {
			return "auth-error";
		} else {
			// 次のインターセプター処理
			return invocation.invoke();
		}
	}

}

というのが正解のソースコード。

じゃあ、何がダメなやつはどこがおかしかったのかと言うと
この Interceptor 独自の戻り値を struts.xml で定義した、global-results の値にマッチングさせたい時
次のインターセプター処理を呼び出してはいけない!!
って事ですな・・・

インターセプターが戻り値を持っている時点でもっと早く気がつけよ。って気がしないでもないです。はい。

ちなみに、 struts.xml はこんな感じ。




  
  

    
      
      
        
        
      
    
    
    
    
      auth/login
    
    
      /WEB-INF/pages/admin/index.jsp
      auth/login
    
  

    
      admin/index
      /WEB-INF/pages/auth/login.jsp
    
  

Tagged with:
Aug 17

一つのアプリで複数のデータベースにアクセス。

それぞれの環境に対して、多くの接続を定義できます。それぞれの接続は同じ名前でラベル付けされたスキーマを参照します。デフォルトで使われる接続名は propelでこれはリスト8-3のpropelスキーマを参照します。nameオプションによって別の接続を作成することができます:

php symfony –name=main configure:database “mysql://login:passwd@localhost/blog”

Tagged with:
Aug 17

redirect での引数の型が違う

これも若干はまりどころですが、redirectする際、’module/action’と文字列で’/'で区切って記述しますが、routingを利用して引数も渡したい場合、素直に書くと’foo/bar/variable’となります。
しかしこのように正直に書いても’variable’が絶ち落とされてしまいます。
この場合はどうするかというと、まずrouting.ymlで下記のように書いてあるものとして、

foo_bar_hoge:
url: /foo/bar/:hoge
param: { module: home, action: bar }
次に、redirectメソッドの引数は素直に書くのではなく、配列で渡します。
$this->redirect(array(‘module’ => ‘foo’, ‘action’ => ‘bar’, ‘hoge’ => ‘variable’));
これで正しくリダイレクトされ、引数も渡されます。

Tagged with:
Aug 17

security.yml

ファイルで、 indexアクションなら

index:
is_secure: on
にするだけ。
後は、アクションの中で
$user = $this->getUser()
$user->setAuthenticated(true);

とすれば、そのページを表示できる。
細かいRoleの設定は

$user->addCredential(‘god’);
$user->addCredentials(‘god’, ’slave’);

Tagged with:
Jan 30

今思ったんだけれどさ、みんな検索する時は、 “django 入門” とかで検索する訳じゃん。Pythonもさ。
でも、自分のエントリーって全部やろう!!なんだよね。ま、いいか?w
硬いのは嫌いだしね~
ってことで、Djangoのcontributeの一つのadminに付いてやります。これはちょっとしたCMSちっくです(・・
最初に、
INSTALLED_APPS = (
‘django.contrib.auth’,
‘django.contrib.contenttypes’,
‘django.contrib.sessions’,
‘django.contrib.sites’,
‘django.contrib.admin’,
‘redhawk.task’,
)
のように、’django.contrib.admin’を追加します。
次に、
python manage.py syncdb
を実行。admin権限のユーザーを作成するか訊いてくるので、作成します。
次に、redhawk.task.modelsにこんなことをしてみます。
python manage.py 192.168.11.40:8000
でサーバ起動。IPアドレスとポート番号は自分の環境にあわせて選んでください。
この場合、アクセスするURLは、

http://192.168.11.40:8000/admin/

になります。

上の様な画面が出るはずなので、ぐりぐり弄くりまわしてみましょう。
で、色々物足りないと思うので、こんな物を追加してみる。
models.py
公式ドキュメントや、本では
def __str__(self)
となっているかもしれないが、最近のバージョンでは
def __unicode__(self)
が推奨となっている。
まあ、どの言語にもよくあることで、__str__はasciiで__unicode__はユニコード企画に変換してくれる訳ですよ。
datetimeに__unicode__がないのは、__str__だけで事足りるからかな?
Rubyは日本人が作っただけあって例外なのかな?使ったことないから分からないけれど、そう聞いたことがある。
さて、これをすると、Objectが、printに渡されたときに、自動的に__unicode__の戻り値が表示されるようになるわけだ。
前のバージョンのままでは、User Objectと表示されていただろうが、これでUser.nameが表示されるので誰だか分かる。
更に、admin画面をカスタマイズ!!こんな事をしてみよう。

更に色々カスタマイズできるけれど、これまたアプリを作りながら見ていったほうが良いと思うので
サンプルアプリつくりながら色々出しておこうかなと。

Tagged with:
preload preload preload