Shiro安全框架与Spring

  1. 引入相关jar包

    org.apache.shiro
    shiro-all
    1.3.2

  1. 在web.xml中配置spring框架提供的用于整合shiro框架的过滤器

  
    shiroFilter
    org.springframework.web.filter.DelegatingFilterProxy
  
  
    shiroFilter
    /*
  
  1. 在spring配置文件中配置bean,id为shiroFilter

    
        
        
        
        
        
        
        
        
        
        
        
            
                /css/** = anon //anon是匿名访问过滤器,相当于不过滤,不用登陆也可以访问,放行
                /js/** = anon
                /images/** = anon
                /validatecode.jsp* = anon
                /login.jsp = anon
                /userAction_login.action = anon
                /page_base_staff.action = perms["staff-list"] //perms是权限检查过滤器
                /* = authc //这个是框架提供的过滤器的别名,检查当前用户是否认证过
            
        
    
    
    
        
    
    
    

使用场景一:登陆认证

Shiro安全框架与Spring_第1张图片
认证流程
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
//使用shiro框架提供的方式进行认证操作
            Subject subject = SecurityUtils.getSubject();//获得当前用户对象,状态为“未认证”
            AuthenticationToken token = new UsernamePasswordToken(model.getUsername(),MD5Utils.md5(model.getPassword()));//创建用户名密码令牌对象,两个参数为账号和密码
            try{
                subject.login(token);//这个方法会去调SecurityManager,没有返回值,用try catch来判断登陆是否成功
            }catch(Exception e){
                e.printStackTrace();
                return LOGIN;//返回登陆界面
            }
//SecurityManager要去调用Realm,所以要写个Realm,请先看下面的MyRealm代码
            User user = (User) subject.getPrincipal();//把MyRealm里简单认证信息对象取出来
            ServletActionContext.getRequest().getSession().setAttribute("loginUser", user);//存到Session里去
            return HOME;

创建个自定义Realm

import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.springframework.beans.factory.annotation.Autowired;


public class MyRealm extends AuthorizingRealm{
    @Autowired
    private UserDao userDao;
    
    //认证方法
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        System.out.println("自定义的realm中认证方法执行了。。。。");
        UsernamePasswordToken passwordToken = (UsernamePasswordToken)token;
        //获得页面输入的用户名
        String username = passwordToken.getUsername();
        //根据用户名查询数据库中的密码
        User user = userDao.findUserByUsername(username);
        if(user == null){
            //页面输入的用户名不存在,认证失败
            return null;
        }
        //简单认证信息对象
        AuthenticationInfo info = new SimpleAuthenticationInfo(user, user.getPassword(), this.getName());
        //框架负责比对数据库中的密码和页面输入的密码是否一致
        return info;
    }

    //授权方法
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
         SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        //为用户授权
        info.addStringPermission("staff-list");//"staff-list"对应前面配置的perms权限检查过滤器,在请求对应的url时会去获取权限,具体实现可以根据业务需求展开
        return info;
    }
}

使用场景二:权限控制

注解式权限控制(代理模式)

  1. 在spring配置文件中配置bean
!-- 开启shiro框架注解支持 -->
    
            
        
    
    
    
    
  1. 在要控制的方法里加上注解
@RequiresPermissions("domethod")//执行这个方法,需要当前用户具有domethod这个权限
    public String method(){
        return "index";
    }
  1. 需要在表现层配置全局异常处理器
    3.1.0 Struts2全局异常配置(struts.xml)
        
        
            /login.jsp
            /unauthorized.jsp
        
        
            
        

3.2.0 SpringMVC全局异常配置(springmvc.xml)

  
    

需要自定义一个全局异常处理器,实现HandlerExceptionResolver接口

private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionResolver.class); 
@Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
            Exception ex) {
            //打印控制台
            ex.printStackTrace();
            //写日志
            logger.debug("测试输出的日志。。。。。。。");
            logger.info("系统发生异常了。。。。。。。");
            logger.error("系统发生异常", ex);
            //发邮件、发短信
            //使用jmail工具包。发短信使用第三方的Webservice。
            //显示错误页面
            ModelAndView modelAndView = new ModelAndView();
            modelAndView.setViewName("error/exception");
            return modelAndView;
    }

页面标签方式权限控制(标签模式)

  1. 在jsp页面中引入shiro的标签库
<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
  1. 使用shiro的标签控制页面元素展示,在要控制权限的元素上

    {
        id : 'button-delete',
        text : '删除',
        iconCls : 'icon-cancel',
        handler : doDelete
    },
    
注:如果没有权限,那么shiro:hasPermission包裹的元素无法展示

你可能感兴趣的:(Shiro安全框架与Spring)