如何shiro中shiroprincipall 属性的属性

&@shiro.principal/&标签在页面得不到值
&@shiro.principal/&标签在页面得不到值& shiro标签在页面都获取不到值。为什么啊》??
JSP页面引用了shiro标签没?
--- 共有 1 条评论 ---
&#assign shiro=JspTaglibs["/WEB-INF/taglib/shiro.tld"] /&
&@shiro.principal/&得不到值
&shiro:principal/&
这么用的吧!
&@shiro.principal/&这是freemarker里的用法,但freemarker里没有shiro的标签。据说能用jsp的标签但我没成功,我自己写了套
--- 共有 6 条评论 ---
: 登录就有了,我用这种方式没成功,不知道怎么配置才对
: 我是这样引入的&#assign shiro=JspTaglibs["/WEB-INF/taglib/shiro.tld"] /&
怎么才算是把用户信息存进去了,然后标签自动就能得到值呢??
: 是不是要引入jsp的标签
: 我登陆了啊,跳到了登录成功页面,后台也能拿到值,但是 在页面 标签取不到值,为什么呀?
: 不用传值,只要登录了就可以显示
后来你是怎么解决的Shiro(8)
这一节是属于授权的内容,我们的例子是要说明如何判断主体是否有相应的角色和权限。
判断主体是否有相应的角色和权限
判断主体是否有相应的角色
判断主体是否有相应的权限
判断主体是否有相应的角色和权限
先把上一节写好的登录逻辑封装成一个工具类:
public class ShiroUtil {
public static Subject login(String configFile,String userName,String passwoord){
Factory&SecurityManager& factory = new IniSecurityManagerFactory(configFile);
SecurityManager securityManager = factory.getInstance();
SecurityUtils.setSecurityManager(securityManager);
Subject currentUser = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(userName,passwoord);
currentUser.login(token);
System.out.println("身份认证成功");
} catch (AuthenticationException e) {
e.printStackTrace();
return currentU
判断主体是否有相应的角色
配置文件片段:
demo1=1234,role1,role2
demo2=1234,role1
我们可以看到一个用户具有的角色是通过一个字符串的集合来表示的。
测试代码:
public class RoleTest {
* 测试是否有角色,测试方法 hasRole
public void testHasRole(){
Subject currentUser = ShiroUtil.login("classpath:shiro.ini","demo1","1234");
System.out.println(currentUser.hasRole("role1"));
System.out.println(currentUser.hasRole("role2"));
boolean[] results = currentUser.hasRoles(Arrays.asList("role1","role2","role3"));
for(boolean result:results){
System.out.println(result);
System.out.println(currentUser.hasAllRoles(Arrays.asList("role1","role2","role3")));
currentUser.logout();
* 与上面的方法的不同之处在于,角色验证没有通过,抛出运行时异常
public void testCheckRole(){
Subject currentUser = ShiroUtil.login("classpath:shiro.ini","demo1","1234");
currentUser.checkRole("role1");
currentUser.checkRole("role2");
currentUser.checkRoles(Arrays.asList("role1","role2"));
currentUser.checkRoles("role1","role2","role3");
判断主体是否有相应的权限
配置文件片段:
demo1=123456,role1,role2
demo2=123456,role1
role1=user:select
role2=user:add,user:update,user:delete
测试代码:
public class PermissionTest {
public void testIsPermitted(){
Subject currentUser = ShiroUtil.login("classpath:shiro.ini", "demo1", "1234");
System.out.println(currentUser.isPermitted("user:select"));
System.out.println(currentUser.isPermitted("user:update"));
System.out.println(currentUser.isPermitted("user:add"));
System.out.println(currentUser.isPermitted("user:delete"));
// 测试是否分别有指定的权限
boolean[] results = currentUser.isPermitted("user:select","user:update","user:add","user:delete");
for(boolean result:results){
System.out.println(result);
// 测试是否拥有全部的权限
System.out.println(currentUser.isPermittedAll("user:select","user:update","user:add","user:delete"));
currentUser.logout();
public void testCheckPermitted(){
Subject currentUser = ShiroUtil.login("classpath:shiro.ini", "demo", "1234");
currentUser.checkPermission("user:select");
currentUser.checkPermissions("user:select","user:update","user:add","user:delete");
currentUser.logout();
Shiro 支持三种方式的授权:
编程式:通过写if/else 授权代码块完成:
Subject subject = SecurityUtils.getSubject();
if(subject.hasRole(“admin”)) {
注解式:通过在执行的Java方法上放置相应的注解完成:
@RequiresRoles("admin")
public void hello() {
@RequestMapping(value="/editItems",method={RequestMethod.GET})
@RequiresPermissions("item:update")
public String editItems(Model model,Integer id)throws Exception{}
JSP/GSP 标签:在JSP/GSP 页面通过相应的标签完成:
name="admin"&
Jsp页面添加:
&%@ tagliburi="http://shiro.apache.org/tags" prefix="shiro" %&
标签条件(均是显示标签内容)
不在登录状态时
用户在没有RememberMe时
用户在RememberMe时
name="abc,123" &
在有abc或者123角色时
name="abc"&
拥有角色abc
name="abc"&
没有角色abc
name="abc"&
拥有权限资源abc
name="abc"&
没有abc权限资源
显示用户身份名称
property="username"/&
显示用户身份中的属性值
配置shiro-permission.ini
shiro-permission.ini里边的内容相当于在数据库
#用户zhang的密码是123,此用户具有role1和role2两个角色
zhang=123,role1,role2
wang=123,role2
#角色role1对资源user拥有create、update权限
role1=user:create,user:update
#角色role2对资源user拥有create、delete权限
role2=user:create,user:delete
#角色role3对资源user拥有create权限
role3=user:create
标识符号规则:资源:操作:实例(中间使用半角:分隔)
user:create:01
表示对用户资源的01实例进行create操作。
user:create:表示对用户资源进行create操作,相当于user:create:*,对所有用户资源实例进行create操作。
user:*:01
表示对用户资源实例01进行所有操作。
当调用controller的一个方法,由于该 方法加了@RequiresPermissions(“item:query”) ,shiro调用realm获取数据库中的权限信息,看”item:query”是否在权限数据中存在,如果不存在就拒绝访问,如果存在就授权通过。
当展示一个jsp页面时,页面中如果遇到,shiro调用realm获取数据库中的权限信息,看item:update是否在权限数据中存在,如果不存在就拒绝访问,如果存在就授权通过。
问题:只要遇到注解或jsp标签的授权,都会调用realm方法查询数据库,需要使用缓存解决此问题。
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1401次
排名:千里之外
原创:31篇
(1)(12)(11)(1)(8)笔记(12)
1. 导入依赖包
&dependency&
&groupId&org.apache.shiro&/groupId&
&artifactId&shiro-guartz&/artifactId&
&version&版本&/version&
&/dependency&
&dependency&
&groupId&commons-collections&/groupId&
&artifactId&commons-collections&/artifactId&
&version&版本&/version&
&/dependency&
2. 修改spring-shiro.xml文件
&!-- Java UUID sessionId生成器 --&
&bean id=&sessionIdGenerator& class=&org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator&/&
&!-- 会话策略 --&
&bean id=&sessionDAO& class=&org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO&&
&property name=&sessionIdGenerator& ref=&sessionIdGenerator&/&
&property name=&activeSessionsCacheName& value=&shiro-activeSessionCache&/&
&bean id=&sessionIdCookie& class=&org.apache.shiro.web.servlet.SimpleCookie&&
&property name=&name& value=&mldn-session-id&/&
&!-- 设置的sessionId的name --&
&property name=&httpOnly& value=&true&/&
&!-- 只支持http --&
&property name=&maxAge& value=&-1&/&
&!-- 浏览器关闭后cookie失效 --&
&bean id=&sessionManager& class=&org.apache.shiro.web.session.mgt.DefaultWebSessionManager&&
&property name=&sessionDAO& ref=&sessionDAO&/&
&property name=&globalSessionTimeout& value=&300000&/&
&property name=&deleteInvalidSessions& value=&true&/&
&property name=&sessionValidationSchedulerEnabled& value=&true&/&
&property name=&sessionIdCookie& ref=&sessionIdCookie&/&
&property name=&sessionIdCookieEnabled& value=&true&/&
&bean id=&sessionValidationScheduler& class=&org.apache.shiro.session.mgt.quartz.QuartzSessionValidationScheduler&&
&property name=&sessionValidationInterval& value=&100000&/&
&property name=&sessionManager& ref=&sessionManager&/&
追加securityManager的属性配置
&property name=&sessionManager& ref=&sessionManager&/&
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:180次
排名:千里之外
原创:15篇授权即访问控制,它将判断用户在应用程序中对资源是否拥有相应的访问权限。&
如,判断一个用户有查看页面的权限,编辑数据的权限,拥有某一按钮的权限等等。&
一、用户权限模型
为实现一个较为灵活的用户权限数据模型,通常把用户信息单独用一个实体表示,用户权限信息用两个实体表示。
用户信息用 LoginAccount 表示,最简单的用户信息可能只包含用户名 loginName 及密码 password 两个属性。实际应用中可能会包含用户是否被禁用,用户信息是否过期等信息。
用户权限信息用 Role 与 Permission 表示,Role 与 Permission 之间构成多对多关系。Permission 可以理解为对一个资源的操作,Role 可以简单理解为 Permission 的集合。
用户信息与 Role 之间构成多对多关系。表示同一个用户可以拥有多个 Role,一个 Role 可以被多个用户所拥有。
权限声明及粒度&
Shiro权限声明通常是使用以冒号分隔的表达式。就像前文所讲,一个权限表达式可以清晰的指定资源类型,允许的操作。同时,Shiro权限表达式支持简单的通配符,可以更加灵活的进行权限设置。&
下面以实例来说明权限表达式。&
可查询用户数据&
User:view&
可查询或编辑用户数据&
User:view,edit&
可对用户数据进行所有操作&
User:*或 user&
可编辑id为123的用户数据&
User:edit:123&
授权处理过程
认证通过后接受 Shiro 授权检查,授权验证时,需要判断当前角色是否拥有该权限。
只有授权通过,才可以访问受保护 URL 对应的资源,否则跳转到“未经授权页面”。
如果我们自定义Realm实现,比如我后面的例子中,自定义了ShiroDbRealm类,当访问被@RequiresPermissions注解的方法时,会先执行ShiroDbRealm.doGetAuthorizationInfo()进行授权。
&span&style="font-size:18px"&@Controller&&
@RequestMapping(value&=&"/user")&&
public&class&UserController&{&&
@Resource(name="userService")&&
private&IUserService&userS&&
@RequestMapping(value&=&"/register")&&
@ResponseBody&&
@RequiresPermissions("user:create")&&
public&boolean&register(User&user){&&
return&userService.register(user);&&
}&/span&&&
二、授权实现&
Shiro支持三种方式实现授权过程:&
JSP Taglig实现
1、基于编码的授权实现&
1、基于权限对象的实现&
创建org.apache.shiro.authz.Permission的实例,将该实例对象作为参数传递给Subject.isPermitted()进行验证。&
Permission&printPermission&=&new&PrinterPermission("laserjet4400n",&"print");&&&&
Subject&currentUser&=&SecurityUtils.getSubject();&&&&
if&(currentUser.isPermitted(printPermission))&{&&&&
}&else&{&&&&
2、基于字符串的实现&
相比笨重的基于对象的实现方式,基于字符串的实现便显得更加简洁。&
Subject&currentUser&=&SecurityUtils.getSubject();&&&&
if&(currentUser.isPermitted("printer:print:laserjet4400n"))&{&&&&
}&else&{&&&&
使用冒号分隔的权限表达式是org.apache.shiro.authz.permission.WildcardPermission默认支持的实现方式。&
这里分别代表了资源类型:操作:资源ID&
2、基于注解的授权实现&
Shiro注解支持AspectJ、Spring、Google-Guice等,可根据应用进行不同的配置。&
相关的注解:&
@RequiresAuthentication&
可以用户类/属性/方法,用于表明当前用户需是经过认证的用户。&&
@RequiresAuthentication&&&&
public&void&updateAccount(Account&userAccount)&{&&&&
&&&&...&&&&
@RequiresPermissions&
当前用户需拥有制定权限&
@RequiresPermissions("account:create")&&&&
public&void&createAccount(Account&account)&{&&&&
&&&&...&&&&
3、基于JSP&TAG的授权实现&
Shiro提供了一套JSP标签库来实现页面级的授权控制。&
在使用Shiro标签库前,首先需要在JSP引入shiro标签:&
hasRole标签&
验证当前用户是否属于该角色
hasPermission标签&
验证当前用户是否拥有制定权限&
三、Shiro授权的内部处理机制&
1、在应用程序中调用授权验证方法(Subject的isPermitted*或hasRole*等)&
2、Sbuject会委托应用程序设置的securityManager实例调用相应的isPermitted*或hasRole*方法。&
3、接下来SecurityManager会委托内置的Authorizer的实例(默认是ModularRealmAuthorizer类的实例,类似认证实例)调用相应的授权方法。&
4、每一个Realm将检查是否实现了相同的Authorizer 接口。然后,将调用Reaml自己的相应的授权验证方法。&
四、授权代码
UserController:处理用户登录后的请求(注册)
package&org.shiro.demo.&&
import&javax.annotation.R&&
import&org.apache.shiro.authz.annotation.RequiresP&&
import&org.apache.shiro.authz.annotation.RequiresR&&
import&org.shiro.demo.entity.U&&
import&org.shiro.demo.service.IUserS&&
import&org.springframework.stereotype.C&&
import&org.springframework.web.bind.annotation.RequestM&&
import&org.springframework.web.bind.annotation.ResponseB&&
@Controller&&
@RequestMapping(value&=&"/user")&&
public&class&UserController&{&&
&&&&@Resource(name="userService")&&
&&&&private&IUserService&userS&&
&&&&@RequestMapping(value&=&"/register")&&
&&&&@ResponseBody&&
&&&&@RequiresPermissions("user:create")&&
&&&&public&boolean&register(User&user){&&
&&&&&&&&return&userService.register(user);&&
&&&&@RequestMapping(value&=&"/toRegister")&&
&&&&@RequiresRoles("administrator")&&
&&&&public&String&toRegister(){&&
&&&&&&&&return&"/system/user/register";&&
ShiroDbRealm:自定义的指定Shiro验证用户授权的类
&span&style="font-size:18px"&packageorg.shiro.demo.service.&&
importjava.util.ArrayL&&
importjava.util.L&&
importjavax.annotation.R&&
mons.lang.StringU&&
importorg.apache.shiro.authc.AuthenticationE&&
importorg.apache.shiro.authc.AuthenticationI&&
importorg.apache.shiro.authc.AuthenticationT&&
importorg.apache.shiro.authc.SimpleAuthenticationI&&
importorg.apache.shiro.authc.UsernamePasswordT&&
importorg.apache.shiro.authz.AuthorizationE&&
importorg.apache.shiro.authz.AuthorizationI&&
importorg.apache.shiro.authz.SimpleAuthorizationI&&
importorg.apache.shiro.realm.AuthorizingR&&
importorg.apache.shiro.subject.PrincipalC&&
importorg.shiro.demo.entity.P&&
importorg.shiro.demo.entity.R&&
importorg.shiro.demo.entity.U&&
importorg.shiro.demo.service.IUserS&&
publicclass&ShiroDbRealm&extends&AuthorizingRealm{&&
privateIUserService&userS&&
publicvoid&setUserService(IUserService&userService)&{&&
this.userService=&userS&&
protectedAuthorizationInfo&doGetAuthorizationInfo(&&
PrincipalCollectionprincipals)&{&&
Stringaccount&=&(String)&super.getAvailablePrincipal(principals);&&
List&String&roles&=&new&ArrayList&String&();&&&
List&String&permissions&=&new&ArrayList&String&();&&
Useruser&=&userService.getByAccount(account);&&
if(user!=&null){&&
if(user.getRoles()&!=&null&&&&user.getRoles().size()&&&0)&{&&
for(Role&role&:&user.getRoles())&{&&
roles.add(role.getName());&&
if(role.getPmss()&!=&null&&&&role.getPmss().size()&&&0)&{&&
for(Permission&pmss&:&role.getPmss())&{&&
if(!StringUtils.isEmpty(pmss.getPermission())){&&
permissions.add(pmss.getPermission());&&
thrownew&AuthorizationException();&&
SimpleAuthorizationInfoinfo&=&new&SimpleAuthorizationInfo();&&
info.addRoles(roles);&&
&&&&&&&&info.addStringPermissions(permissions);&&
}&/span& &
阅读(...) 评论()}

我要回帖

更多关于 shiro principal null 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信