如何在spring中整合shiro-创新互联-成都快上网建站

如何在spring中整合shiro-创新互联

这篇文章将为大家详细讲解有关如何在spring中整合shiro,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

创新互联公司是一家专注于做网站、成都网站建设与策划设计,天峨网站建设哪家好?创新互联公司做网站,专注于网站建设十多年,网设计领域的专业建站公司;建站业务涵盖:天峨等地区。天峨做网站价格咨询:13518219792

一、添加相关依赖


   org.apache.shiro
   shiro-core
   1.2.1
  
  
   org.apache.shiro
   shiro-web
   1.2.1
  
  
   org.apache.shiro
   shiro-ehcache
   1.2.1
  
  
   org.apache.shiro
   shiro-spring
   1.2.1
   
  
   commons-logging
   commons-logging
   1.2
  

二、编写代码

1、自定义realm

public class CommonRealm extends AuthorizingRealm {
 @Autowired
 private UserLoginService userLoginService;
 @Override
 public String getName() {
  return "CommonRealm";
 }
 //授权
 @Override
 protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
  String usernmae = (String) principals.getPrimaryPrincipal();
  List permissions = new ArrayList();
  if ("admin".equals(usernmae)) {
   permissions.add("admin:ee");
  }
  SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
  info.addStringPermissions(permissions);
  return info;
 }
 //身份认证
 @Override
 protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
  String username = (String) token.getPrincipal();
  User user = userLoginService.getUser(username);
  if (user == null) {
   return null;
  }
  SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(username, user.getPassword(), getName());
  return info;
 }
}

2、login controller

@Controller
public class UserAction {
 @Autowired
 private UserLoginService userLoginService;
 @RequestMapping("/login.do")
 public String userLogin(HttpServletRequest request, String username, String password) throws Exception {
  // 如果登陆失败从request中获取异常信息,shiroLoginFailure就是shiro异常类的全限定名
  String exceptionClassName = (String) request.getAttribute("shiroLoginFailure");
  if (exceptionClassName != null) {
   if (UnknownAccountException.class.getName().equals(exceptionClassName)) {
    // 最终会抛给异常处理器
    throw new XXXException("用户名不存在");
   } else if (IncorrectCredentialsException.class.getName().equals(exceptionClassName)) {
    throw new XXXException("用户名/密码错误");
   } else {
    throw new Exception();// 最终在异常处理器生成未知错误
   }
  }
  // 如果登录成功的话不走此方法,shiro认证成功会自动跳转到上一个请求路径,配的的successUrl没效果,后边会说
  // 登陆失败走此方法,捕获异常,然后 return ~ ,还到login页面
  return "login.jsp";
 }
}

3、检测权限 controller

 //此方法为了验证权限是否生效
 @RequestMapping("/findAll.do")
 @RequiresPermissions("admin:ee")
 public ModelAndView list(HttpServletRequest request){
  ....... 
 }

三、常见问题

因为有一些特别常见的问题,需要修改xml配置,所以现在先手问题,把xml配置放在后边,直接就配置完善好的xml

问题一:登陆成功后shiro默认跳到上一次请求,没有上一次请求默认跳到/  ,那我们就想控制调到自己定义的路径咋办呢?

解决方案:

步骤一:继承FormAuthenticationFilter类,重写onLoginSuccess方法,这里可以自定义路径,因为这里自定义了成功跳转的路径,所以配置里的successUrl不用配置,赔了也没效果。。

public class LoginSuccessToFilter extends FormAuthenticationFilter {
 @Override
 protected boolean onLoginSuccess(AuthenticationToken token, Subject subject, ServletRequest request, ServletResponse response) throws Exception {
  WebUtils.getAndClearSavedRequest(request);
  WebUtils.redirectToSavedRequest(request,response,"/findAll.do");
  return false;
 }
}

步骤二:

在shiro的xml配置文件中配置

 

在 shiroFilter配置中引入,完整xml在后边


  
   
    
   
  


  
   
    
   
  

四、Xml配置

applicationContext-shiro.xml


 
  
  
  
   
    
   
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
   
    
    /image/** = anon
    /css/** = anon
    /js/** = anon
    /logout.do = logout
    /** = authc
   
  
 
 
 
 
  
  
  
  
  
  
  
 
 
 
 
 
 
   
  
  
  
  
 

springmvc的配置



 
 
 
 
 
  
 
 
  
 

关于如何在spring中整合shiro就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。


分享名称:如何在spring中整合shiro-创新互联
文章路径:http://kswjz.com/article/jgpch.html
扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流