23

ユーザーがシステムにログインした後、アクセスを制御したいと思います。

例えば:

administrator : can add, delete and give rights to employee
employee : fill forms only
...

したがって、ユーザーがどの権利を持っているかを知り、データベースをチェックインした後、このユーザーが表示および実行できる内容を制限したいと思います。それを行う簡単な方法はありますか?

編集

@WebFilter("/integra/user/*")
public class LoginFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {    
        HttpServletRequest req = (HttpServletRequest) request;
        Authorization authorization = (Authorization) req.getSession().getAttribute("authorization");

        if (authorization != null && authorization.isLoggedIn()) {
            // User is logged in, so just continue request.
            chain.doFilter(request, response);
        } else {
            // User is not logged in, so redirect to index.
            HttpServletResponse res = (HttpServletResponse) response;
            res.sendRedirect(req.getContextPath() + "/integra/login.xhtml");
        }
    }

    // You need to override init() and destroy() as well, but they can be kept empty.


    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void destroy() {
    }
}
4

1 に答える 1

35

まあ、これはかなり広い主題です。あなたが自作の認証から始めているので、私は自作の承認に答えを向けます。


モデルが適切に設計されていれば、Java/JSFでの役割チェックはそれ自体比較的簡単です。1人のユーザーが複数の役割を持つことができると仮定すると(実際のアプリケーションではよくあることですが)、最終的には次のようなものになります。

public class User {

    private List<Role> roles;

    // ...

    public boolean hasRole(Role role) {
        return roles.contains(role);
    }

}
public enum Role {

    EMPLOYEE, MANAGER, ADMIN;

}

これにより、JSFビューで次のように確認できます。

<h:selectManyCheckbox value="#{user.roles}" disabled="#{not user.hasRole('ADMIN')}">
    <f:selectItems value="#{Role}" />
</h:selectManyCheckbox>
<h:commandButton value="Delete" rendered="#{user.hasRole('ADMIN')}" />

そしてあなたのフィルターで:

String path = req.getRequestURI().substring(req.getContextPath().length());

if (path.startsWith("/integra/user/admin/") && !user.hasRole(Role.ADMIN)) {
    res.sendError(HttpServletResponse.SC_UNAUTHORIZED);
}

最も難しい部分は、このJavaモデルを正常なDBモデルに変換することです。具体的なビジネス要件に応じていくつかの異なる方法があり、それぞれに独自の(不)利点があります。あるいは、JavaモデルのベースとなるDBモデルがすでにあるのでしょうか(したがって、ボトムアップで設計する必要があります)。

とにかく、JPA 2.0を使用していて(質問履歴で少なくともこれを確認できます)、トップダウンで設計できると仮定すると、最も簡単な方法の1つは、rolesプロパティをテーブル@ElementCollectionに対してマップすることです。列挙型user_rolesを使用しているため、2番目のテーブルは必要ありません。繰り返しますが、それは具体的な機能要件とビジネス要件によって異なります。Rolerole

一般的なSQL用語では、user_rolesテーブルは次のようになります。

CREATE TABLE user_roles (
    user_id BIGINT REFERENCES user(id),
    role VARCHAR(16) NOT NULL,
    PRIMARY KEY(user_id, role)
)

次に、次のようにマッピングされます。

@ElementCollection(targetClass=Role.class, fetch=FetchType.EAGER)
@Enumerated(EnumType.STRING)
@CollectionTable(name="user_roles", joinColumns={@JoinColumn(name="user_id")})
@Column(name="role")
private List<Role> roles;

User基本的に、エンティティで変更する必要があるのはこれだけです。


自作の認証(ログイン/ログアウト)と承認(ロールチェック)の横に、Java EEが提供するコンテナ管理認証もあります。これを使用して、またはでログインしj_security_checkたりHttpServletRequest#login()HTTPリクエストをフィルタリング<security-constraint>したり、ログインweb.xmlしたユーザー#{request.remoteUser}そのロールを#{request.isUserInRole('ADMIN')}チェックしたりできます。 、など。

次に、 PicketLinkSpring SecurityApache Shiroなどのサードパーティフレームワークがいくつかあります。しかし、これはすべて問題外です:)

于 2012-09-21T00:03:50.687 に答える