博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
shiro权限配置的细节问题&认证
阅读量:6564 次
发布时间:2019-06-24

本文共 4102 字,大约阅读时间需要 13 分钟。

细节:

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

 

 

/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    
username:
password:
 
在application中
/login.jsp = anon /shiro/login = anon # everything else requires authentication: /** = authc

 

 

 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 = "1234";        //realmName:当前realm对象为name,调用父类的getName()方法即可        String realmName = getName();        SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(principal, credentials, realmName);        return info;    }}

 

 

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

 

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

 

 

 此时我们需要登出的操作

list.jsp
    list.        Logout  

 

 

 在applicationContext.xml文件中:

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

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

转载于:https://www.cnblogs.com/Mrchengs/p/9980910.html

你可能感兴趣的文章
Linux 用户和用户组管理
查看>>
tomcat架构分析(valve源码导读)
查看>>
spring中InitializingBean接口使用理解(转)
查看>>
基于php5.5使用PHPMailer-5.2发送邮件
查看>>
InstallShield 2012 Spring新功能试用(16): Suite/Advanced UI 或 Advanced UI安装程序能在安装时进行输入合法性校验与反馈...
查看>>
C#面试宝典
查看>>
基金项目的英文
查看>>
《软件性能测试与LoadRunner实战教程》喜马拉雅有声图书上线
查看>>
ios 字典转模型
查看>>
Java类集
查看>>
类的生命周期
查看>>
php apache用户写文件夹权限设置
查看>>
003-诠释 Java 工程师【一】
查看>>
浅析rune数据类型
查看>>
普通用户开启AUTOTRACE 功能
查看>>
Bind+Nginx实现负载均衡
查看>>
游侠原创:推荐一款免费的Syslog转发工具
查看>>
UIKeyboard键盘相关知识点-IOS开发
查看>>
你真的会 snapshot 吗? - 每天5分钟玩转 OpenStack(163)
查看>>
onAttachedToWindow和onDetachedFromWindow调用时机源码解析
查看>>