java shiro实例_spring+shiro 整合实例代码详解

一、添加相关依赖

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

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"

xmlns:context="http://www.springframework.org/schema/context"

xmlns:aop="http://www.springframework.org/schema/aop" xmlns:jee="http://www.springframework.org/schema/jee"

xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:util="http://www.springframework.org/schema/util"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd

http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd

http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd

http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">

/image/** = anon

/css/** = anon

/js/** = anon

/logout.do = logout

/** = authc

springmvc的配置

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:aop="http://www.springframework.org/schema/aop"

xmlns:tx="http://www.springframework.org/schema/tx"

xmlns:context="http://www.springframework.org/schema/context"

xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:jdbc="http://www.springframework.org/schema/jdbc"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop.xsd

http://www.springframework.org/schema/tx

http://www.springframework.org/schema/tx/spring-tx.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context.xsd

http://www.springframework.org/schema/mvc

http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd">

以上就是一个大概的整合和遇到的两个问题,博主也是查阅了很多的博客得到的较优答案,整理出来,已备后续参考,遇到一样问题的同学可以看看

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值