Shiro的学习 (5)

如下代码,除了登录中要用到 Shiro的Subject,其余没改动

@Controller @RequestMapping("/user") public class ShiroController { @RequestMapping("/delete") public String deleteUser(){//访问此删除功能时要先经过shiro的安全校验 System.out.println("delete User"); return "forward:/xx.jsp"; } @RequestMapping("/update") public String updateUser(){//访问此更新功能时要先经过shiro的安全校验 System.out.println("update User"); return "forward:/xx.jsp"; } @RequestMapping("/insert") public String insertUser(){//访问此增加功能时要先经过shiro的安全校验 System.out.println("insert User"); return "forward:/xx.jsp"; } @RequestMapping("/login/page") public String login(String username,String password){ System.out.println("goto login.jsp"); return "forward:/login.jsp"; } @RequestMapping("/login/logic") public String login(String username,String password){//登录功能不能被shiro校验,否则永不能登录 try{ Subject subject = SecurityUtils.getSubject(); subject.login(new UsernamePasswordToken(username,password)); String uname = (String)subject.getPrincipal(); System.out.println("uname:"+uname); }catch (AuthenticationException e){ e.printStackTrace(); return "redirect:/login.jsp"; } return "forward:/success.jsp"; } } 5.3 配置 5.3.1 web.xml

安装 ShiroFilter

<!-- 接收所有请求,以通过请求路径 识别是否需要 安全校验,如果需要则触发安全校验 做访问校验时,会遍历过滤器链。(链中包含shiro.ini中urls内使用的过滤器) 会通过ThreadContext在当前线程中绑定一个subject和SecurityManager,供请求内使用 可以通过SecurityUtils.getSubject()获得Subject --> <filter> <filter-name>shiroFilter</filter-name> <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class> </filter> <filter-mapping> <filter-name>shiroFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 在项目启动时,加载web-info 或 classpath下的 shiro.ini ,并构建WebSecurityManager。 构建所有配置中使用的过滤器链(anon,authc等),ShiroFilter会获取此过滤器链 --> <listener> <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class> </listener> <!-- 自定义ini文件名称和位置 <context-param> <param-name>shiroConfigLocations</param-name> <param-value>classpath:shiro9.ini</param-value> </context-param>--> <!-- springMVC的配置照旧,此处省略...--> 5.3.2 shiro.ini

新增部分(section) [urls]

如下定义shiro的Realm、访问控制细节

[main] #没有身份认证时,跳转地址 shiro.loginUrl = /user/login/page #角色或权限校验不通过时,跳转地址 shiro.unauthorizedUrl=http://www.likecs.com/author/error #登出后的跳转地址,回首页 shiro.redirectUrl=http://www.likecs.com/ #注意:此处实在安装自定义Realm 指定realm #声明Realm 名称 = Realm类路径 realm1 = com.zhj.realm.MyRealm realm2 = com.zhj.realm.MyRealm2 #安装Reaml 关联到SecurityManager securityManager.realms=$realm1,$realm2 [urls] # 如下格式:"访问路径 = 过滤器" #【1.ant路径:? * ** 细节如下】 # /user/login/page , /user/login/logic 是普通路径 # /user/* 代表/user后还有一级任意路径 : /user/a , /user/b , /user/c , /user/xxxxxxxxxxx # /user/** 代表/user后还有任意多级任意路径: /user/a , /user/a/b/c , /user/xxxx/xxxxxx/xxxxx # /user/hello? 代表hello后还有一个任意字符: /user/helloa , /user/hellob , /user/hellox #【2.过滤器,细节如下】 # anon => 不需要身份认证 # authc => 指定路径的访问,会验证是否已经认证身份,如果没有则会强制转发到 最上面配置的loginUrl上 # ( ops:登录逻辑本身千万不要被认证拦截,否则无法登录 ) # logout => 访问指定的路径,可以登出,不用定义handler。 # roles["manager","seller"] => 指定路径的访问需要subject有这两个角色 # perms["user:update","user:delete"] => 指定路径的访问需要subject有这两个权限 /user/login/page = anon /user/login/logic = anon /user/query = authc /user/update = authc,roles["manager","seller"] /user/delete = authc, perms["user:update","user:delete"] /user/logout = logout #其余路径都需要身份认证【用此路径需谨慎】 /** = authc #【3.注意】 # url的匹配,是从上到下匹配,一旦找到可以匹配的则停止,所以,通配范围大的url要往后放, # 如"/user/delete" 和 "/user/**" 5.3.3 其他默认过滤器

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zygjwp.html