博客
关于我
强烈建议你试试无所不能的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

你可能感兴趣的文章
Android布局解析,图文(转)
查看>>
ASP.NET Redis 开发 入门
查看>>
c++ primer读书笔记之c++11(一)
查看>>
【Xamarin For IOS 开发需要的安装文件】
查看>>
svn服务器配置以及自动同步到web服务器
查看>>
zoj 1738 - Lagrange's Four-Square Theorem
查看>>
【iOS】Object-C注释
查看>>
Linux设备驱动之Ioctl控制【转】
查看>>
NSArray 初始化
查看>>
Android:简单联网获取网页代码
查看>>
抽象类,摘要方法
查看>>
武汉出租车集体罢工 是打车软件的错?
查看>>
Memcached完全解剖–1. memcached基金会
查看>>
Sqlite-SQLiteHelper类,操作SQLite数据库
查看>>
BZOJ 1823 JSOI 2010 盛宴 2-SAT
查看>>
软测试-计算机组成原理、系统和网络安全机构
查看>>
AndroidStudio的一些坑
查看>>
C++小思
查看>>
【转】人,技术与流程
查看>>
hdu 4710 Balls Rearrangement (数学思维)
查看>>