Shiro在web的授权检测(权限角色验证)

一、角色检测
1、建立Servlet程序来进行具体的登录操作处理。

@WebServlet("/shiroLogin")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String mid = request.getParameter("mid") ;
        String password = request.getParameter("password") ;
        Subject subject = SecurityUtils.getSubject() ;
        UsernamePasswordToken token = new UsernamePasswordToken(mid,password) ;
        subject.login(token);
        request.getSession().setAttribute("mid", mid);
        request.getRequestDispatcher("/pages/welcome.jsp").forward(request, response);
    } 
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

}

2、在项目中建立前台表单界面

"shiroLogin" method="post"> 用户名:type="text" name="mid" id="mid">
密 码:type="password" name="password" id="password">
type="submit" value="登录"> type="reset" value="重置">

3、设置验证的Realm

public class MyRealm extends AuthorizingRealm {
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        System.out.println("********** 2、用户角色与权限:doGetAuthorizationInfo **********");
        String username = (String) principals.getPrimaryPrincipal() ;   // 取得用户登录名
        SimpleAuthorizationInfo auth = new SimpleAuthorizationInfo() ;  // 定义授权信息的返回数据
        MemberLoginService service = new MemberLoginService() ; // 进行业务层处理
        auth.setRoles(service.listRolesByMember(username));// 所有的角色必须以Set集合的形式出现
        auth.setStringPermissions(service.listActionsByMember(username));   // 所有的权限必须以Set集合的形式出现
        service.close();
        return auth;
    }
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        System.out.println("********** 1、用户登录认证:doGetAuthenticationInfo() **********");
        // 1、登录认证的方法需要先执行,需要用他来判断登录的用户信息是否合法
        String username = (String) token.getPrincipal() ;   // 取得用户名
        // 需要通过用户名取得用户的完整信息,利用业务层操作
        MemberLoginService service = new MemberLoginService() ;
        Member vo = service.get(username) ; // 需要取得的是用户的信息
        service.close(); 
        if (vo == null) {
            throw new UnknownAccountException("该用户名称不存在!") ;
        } else {    // 进行密码的验证处理
            String password = new String((char []) token.getCredentials()) ;
            // 将数据库中的密码与输入的密码进行比较,这样就可以确定当前用户是否可以正常登录
            if (vo.getPassword().equals(password)) {    // 密码正确
                AuthenticationInfo auth = new SimpleAuthenticationInfo(username, password, "memberRealm") ;
                return auth ;
            } else {
                throw new IncorrectCredentialsException("密码错误!") ;
            }
        }
    } 

4、设置shiro.ini文件

[main]
# 如果现在认证失败,则跳转到loginUrl配置的路径
authc.loginUrl=/login.jsp
# 需要配置上当角色认证失败之后的跳转页面
roles.unauthorizedUrl=/role.jsp
jdbcRealm=cn.mldn.realm.MyRealm
securityManager.realms=$jdbcRealm
# 配置所有需要进行路径检测的页面
[urls]
# 登录的页面是不需要进行检测处理的
/shiroLogin=anon
# 指定的页面需要进行登录检测,此时表示需要先进行身份认证,而后再进行角色认证,当前路径下需要member的角色或者dept的角色
/pages/welcome.jsp=authc,roles[member],roles[dept]

二、权限检测

[main]
# 如果现在认证失败,则跳转到loginUrl配置的路径
authc.loginUrl=/login.jsp
# 需要配置上当角色认证失败之后的跳转页面
roles.unauthorizedUrl=/role.jsp
# 配置权限认证失败的跳转页面
perms.unauthorizedUrl=/role.jsp
jdbcRealm=cn.mldn.realm.MyRealm
securityManager.realms=$jdbcRealm
# 配置所有需要进行路径检测的页面
[urls]
# 登录的页面是不需要进行检测处理的
/shiroLogin=anon
# 需要member或者是dept的角色
# /pages/welcome.jsp=authc,roles[member],roles[dept]
# 对指定页面登录之后进行权限的检测处理,需要member:add或dept:add的权限
/pages/welcome.jsp=authc,perms[member:add],perms[dept:add]

(…其余和上面代码一样,只需要修改配置文件即可)

你可能感兴趣的:(shiro,shiro)