细节:

---[urls]部分配置,其格式是    url=拦截器【参数】 ,拦截器【参数】
---如果当前请求的 url 匹配 【urls】 部分或者某个url模式,将会执行配置的拦截器
---anon(anonymous)拦截器表示匿名访问(即不需要登陆验证)
---authc(authentication)拦截器的表示需要身份认证之后才能访问
<property name="filterChainDefinitions">
<value>
/login.jsp = anon
# everything else requires authentication:
/** = authc
</value>
</property>

               /login.jsp = anon
# everything else requires authentication:
/** = authc
/user.jsp = anon

此时上面的会覆盖下面的user.jsp 无法访问

 认证:

步骤:
1.获取当前subject,SecurityUtils.getSubject();
2.测试当前用户是否已经被认证,即是否已经登陆, currentUser.isAuthenticated()
3.若没有认证则/把用户名和密码封装为UsernamePasswordToken对象
    -创建一个表单
    -把请求提交到spriingmvc 的handler
    -获取用户和密码
4.执行登陆 currentUser.login(token);
5.自定义Relam方法,从数据库中获取相应的记录,返回给Shiro
    -实际上是需要集成org.apache.shiro.realm.AuthenticatingRealm
    -实现doGetAuthenticationInfo()方法
6.有shiro完成对密码的比对

测试使用到的文件:

下面开始代码过程:
login.jsp页面的登陆标志代码:
    login
<form action="shiro/login" method="post">
username:<input type="text" name="username">
password:<input type="password" name="password">
<input type="submit" value="submit">
</form>
 
在application中
<property name="filterChainDefinitions">
<value>
/login.jsp = anon
/shiro/login = anon
# everything else requires authentication:
/** = authc
</value>
</property>

ShiroHandler.java

@Controller
@RequestMapping("/shiro")
public class ShiroHandler {
@RequestMapping("/login")
public String login(@RequestParam("username")String username,@RequestParam("password") String password){ Subject currentUser = SecurityUtils.getSubject();
if (!currentUser.isAuthenticated()) {
//把用户名和密码封装为UsernamePasswordToken对象
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
token.setRememberMe(true);
try {
//执行登陆
currentUser.login(token);
}catch (AuthenticationException ae) {
System.out.println("登陆失败" + ae.getMessage());
}
} 成功之后做重定向
return "redirect:/list.jsp";
}
}

在applicationContext中需要扫描这个类的包

ShiroRealm.java

做登陆验证实现下面的接口即可
doGetAuthenticationInfo(AuthenticationToken arg0)的arg0是指就是UsernamePasswordToken token = new  UsernamePasswordToken(username, password);
public class ShiroRealm extends AuthenticatingRealm {

    @Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken arg0) throws AuthenticationException {
System.out.println("doGetAuthenticationInfo" + arg0); //1.把AuthenticationToken转为UsernamePasswordToken
UsernamePasswordToken upToken = (UsernamePasswordToken) arg0; //2.从UsernamePasswordToken获取username
String username = upToken.getUsername(); //3.调用数据库的方法,从数据库查询username对应的用户记录
System.out.println("从数据库中获取username:" + username); //4.若用户不存在可以抛出异常 UnKnownAccountException异常
if("unknow".equals(username)){
throw new UnknownAccountException("username 不存在");
}
//5.根据用户信息的清空决定是否需要抛出其他的异常
if("monster".equals(username)){
throw new LockedAccountException("用户被锁定");
}
//6.根据用户的情况来构建AuthenticationInfo并且返回
//以下信息是从数据库中获取的
//principal:认证的实体信息,可以是username,也可以是数据表对应的实体对象
Object principal = username;
//credentials:密码
Object credentials = "";
//realmName:当前realm对象为name,调用父类的getName()方法即可
String realmName = getName();
SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(principal, credentials, realmName); return info;
}
}

当我们输入密码为1234,以及其他为username(除了上图的两个)
此时我们就有权限对其他的页面进行测试

出错之后的异常还是会打印的

 此时我们需要登出的操作

list.jsp
<body>
list. <a href="shiro/logout">Logout</a>
</body>

在applicationContext.xml文件中:

  <!--
配置那些页面需要受保护,以及访问这些页面需要的的权限 )anon 可以被匿名访问
)authc 必须认证即登陆后才可以访问的页面
3).logout登出
-->
<property name="filterChainDefinitions">
<value>
/login.jsp = anon
/shiro/login = anon
/shiro/logout = logout # everything else requires authentication:
/** = authc
</value>
</property>

但我们点击这个超链接的 时候就会立马退出来到login.jsp页面中

最新文章

  1. http://www.cnblogs.com/zhaoyang/archive/2012/01/07/2315436.html
  2. ASP.net MVC3 报错&quot;未找到视图“Index”或其母版视图,或没有视图引擎支持搜索的位置 &quot;的解决方法
  3. vs2010开发android的准备工作
  4. cxf 报错:java.lang.NoSuchMethodError: org.apache.ws.commons.schema.XmlSchemaCollection.read(Lorg/w3c/dom/Document;Ljava/lang/String;)
  5. js/j&#39;query相互转换操作指南
  6. 设计模式 --&gt; (13)备忘录模式
  7. Java遍历时删除List、Set、Map中的元素(源码分析)
  8. maven pom.xml 里scope的作用
  9. 【.NET Core项目实战-统一认证平台】第十章 授权篇-客户端授权
  10. SNMP 优秀帖子
  11. (void) (&amp;_min1 == &amp;_min2);【转】
  12. ThinkPHP框架 AJAX方法返回 AJAX实现分页例子:
  13. C++学习(二十五)(C语言部分)之 结构体2
  14. python一些东西
  15. httpClient 深入浅出~
  16. 软件架构设计学习总结(15):远程通信(RPC,Webservice,RMI,JMS、EJB、JNDI的区别)对比
  17. Javascript 匿名函数与闭包
  18. GIT回推本地commit近期版本
  19. Windows下搭建elasticsearch集群案例
  20. mysql 分片

热门文章

  1. Expression Blend实例中文教程(3) - 布局控件快速入门Grid
  2. VS编译完成后自动复制到远程机器
  3. fzu 2136 取糖果 好几种方法解决。
  4. Linux 创建python虚拟环境
  5. 软件项目技术点(6)——结合鼠标操作绘制动态canvas画布
  6. web前端开发需要具备的技能
  7. 01_编程规约——OOP规约
  8. 学习C++从入门到精通的的十本最经典书籍
  9. css3 background-sizing 属性,捎带 background-repeat 属性
  10. 关于H5的自定义属性data-*