12月3日

ログアウトの設定

ログアウトを実行したい場合、spring-security.xml に以下の設定をする。

<sec:http auto-config="true">
    <intercept-url pattern="/**" access="ROLE_USER" />
    <sec:form-login login-page="/login.jsp"
        default-target-url="/home"
        authentication-failure-handler-ref="authenticationFailureHandler" />
    <sec:logout
        logout-url="/logout"
        logout-success-url="/"
        invalidate-session="true"
        delete-cookies="JSESSIONID" />
</sec:http>
 
<beans:bean id="authenticationFailureHandler"
    class="org.springframework.security.web.authentication.ExceptionMappingAuthenticationFailureHandler">
    <beans:property name="defaultFailureUrl" value="/login.jsp?error=true"/>
    <beans:property name="useForward" value="true"/>
</beans:bean>

ログインしたユーザー情報の取得

ログインしたユーザーを取得するには、コントローラの引数に Principal を追加する。
ここでは、追加した Princical から getName()メソッドでユーザー名を取得し、addAttribute() で name に値を設定している。

@RequestMapping(value = "/home", method = RequestMethod.GET)
public String home(Model model, Principal p) {
    model.addAttribute("name", p.getName());
    return "home";
}

Userインスタンスの取得

Principal から取得できるのは名前だけなので、詳細な情報を取得するには、名前をキーにしてUsersテーブルから取得する必要がある。
Usersテーブルから名前をキーにして取得するために、DAOにメソッド定義 findByName() を追加する。

UserDao.java

public interface UserDao<T> {
    public List<T> getAll();
    public T findById(long id);
    public T findByName(String name);
    public void add(T data);
    public void update(T data);
    public void delete(T data);
    public void delete(long id);
}

UserDaoImpl で、検索機能を実装する。

UserDaoImpl.java

public class UserDaoImpl implements UserDao<User> {
    private static EntityManagerFactory factory = Persistence.createEntityManagerFactory("persistenceUnit");
 
    public List<User> getAll() {
        EntityManager manager = factory.createEntityManager();
        CriteriaBuilder builder = manager.getCriteriaBuilder();
        CriteriaQuery<User> query = builder.createQuery(User.class);
        Root<User> root = query.from(User.class);
        query.select(root);
        List<User> list = null;
        try {
            list = manager.createQuery(query).getResultList();
        } catch (NoResultException e) {
            //
        }
        return list;
    }
 
    public User findById(long id) {
        EntityManager manager = factory.createEntityManager();
        CriteriaBuilder builder = manager.getCriteriaBuilder();
        CriteriaQuery<User> query = builder.createQuery(User.class);
        Root<User> root = query.from(User.class);
        query.select(root).where(builder.equal(root.get("id"), id));
        User u = null;
        try {
            u = manager.createQuery(query).getSingleResult();
        } catch (NoResultException e) {
            //
        }
        return u;
    }
 
    public User findByName(String name) {
        EntityManager manager = factory.createEntityManager();
        CriteriaBuilder builder = manager.getCriteriaBuilder();
        CriteriaQuery<User> query = builder.createQuery(User.class);
        Root<User> root = query.from(User.class);
        query.select(root).where(builder.equal(root.get("name"), name));
        User u = null;
        try {
            u = manager.createQuery(query).getSingleResult();
        } catch (NoResultException e) {
            //
        }
        return u;
    }
 
    public void add(User user) {
        EntityManager manager = factory.createEntityManager();
        EntityTransaction transaction = manager.getTransaction();
        transaction.begin();
        User u = findById(user.getId());
        if (u == null) {
            try {
                manager.persist(user);
                transaction.commit();
            } catch (PersistenceException e) {
                transaction.rollback();
            }
            manager.close();
        } else {
            throw new PersistenceException("Duplicate user-id : " + u.getId());
        }
    }
 
    public void update(User user) {
        EntityManager manager = factory.createEntityManager();
        EntityTransaction transaction = manager.getTransaction();
        transaction.begin();
        try {
            manager.merge(user);
            transaction.commit();
        } catch (PersistenceException e) {
            transaction.rollback();
        }
        manager.close();
    }
 
    public void delete(User user) {
        EntityManager manager = factory.createEntityManager();
        EntityTransaction transaction = manager.getTransaction();
        transaction.begin();
        try {
            manager.remove(user);
            transaction.commit();
        } catch (PersistenceException e) {
            transaction.rollback();
        }
        manager.close();
    }
 
    public void delete(long id) {
        delete(findById(id));
    }
 
}

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です