频道栏目
首页 > 资讯 > 其他 > 正文

Spring集成Shiro

18-02-12        来源:[db:作者]  
收藏   我要投稿

一、pom.xml引入Shiro

可以引入Apache Shiro所有的包


		
			org.apache.shiro
			shiro-all
			${shiro.version}
		

或者是根据项目需求引入需要的jar



	org.apache.shiro
	shiro-core
	${shiro.version}



	org.apache.shiro
	shiro-web
	${shiro.version}



	org.apache.shiro
	shiro-spring
	${shiro.version}

二、配置web.xml,配置web应用中的Shiro Filter


    
        
        shiroFilter
        org.springframework.web.filter.DelegatingFilterProxy
    
    
        shiroFilter
        /*
    
注意:此配置需要配置在其他拦截器之前

三、配置applicationContext-shiro.xml



	
	 
	
		
		
		
		
		
		
		
		
		
		
			
				/login.html* = anon
				
				/user_login.action* = anon
				/validatecode.jsp* = anon
				/css/** = anon
				/js/** = anon
				/images/** = anon
				/services/** = anon 
				/pages/base/courier.html* = perms[courier:list]
				/pages/base/area.html* = roles[base]
				/** = authc
			
		
	
	
	
	
		
		
		
	
	
	
	-->
		
		
	

	
	
		
	
	
	
		
		
	
	
		 
	
	
Ant风格资源地址支持3种匹配符:

: 匹配文件名中的一个字符

* : 匹配文件名中的任意字符

** : 匹配多层路径

Shiro中的默认过滤器

anon:例子/admins/**=anon 没有参数,表示可以匿名使用

authc:例如/admins/user/**=authc表示需要认证(登录)才能使用,没有参数
authcBasic:例如/admins/user/**=authcBasic没有参数表示httpBasic认证
logout:注销登录,任何现有的Session都将会失效,而且任何身份都将会失去关联
noSessionCreation:阻止在请求期间创建新的会话,以保证无状态的体验
perms:例子/admins/user/**=perms[user:add:*],参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,例如/admins/user/**=perms["user:add:*,user:modify:*"],当有多个参数时必须每个参数都通过才通过,想当于isPermitedAll()方法。
roles:例子/admins/user/**=roles[admin],参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,当有多个参数时,例如admins/user/**=roles["admin,guest"],每个参数通过才算通过,相当于hasAllRoles()方法。
port:例子/admins/user/**=port[8081],当请求的url的端口不是8081是跳转到schemal://serverName:8081queryString,其中schmal是协议http或https等,serverName是你访问的host,8081是url配置里port的端口,queryString
是你访问的url里的?后面的参数。
rest:例子/admins/user/**=rest[user],根据请求的方法,相当于/admins/user/**=perms[user:method] ,其中method为post,get,delete等。
ssl:例子/admins/user/**=ssl没有参数,表示安全的url请求,协议为https
user:例如/admins/user/**=user没有参数表示必须存在用户,当登入操作时不做检查

注意:anon,authcBasic,auchc,user是认证过滤器,perms,roles,ssl,rest,port是授权过滤器

四、UserAction

@Namespace("/")
@ParentPackage("json-default")
@Controller
@Scope("prototype")
public class UserAction extends BaseAction {

    @Action(value = "user_login",
            results = {@Result(name = "login", type = "redirect", location = "login.html"),
                    @Result(type = "redirect", location = "index.html")})
    public String login() {

        // 用户名和密码都保存在model中
        // 基于shiro实现登录
        Subject subject = SecurityUtils.getSubject();
        AuthenticationToken authenticationToken = new UsernamePasswordToken(model.getUsername(), model.getPassword());
        try {
            subject.login(authenticationToken); // shiro执行流程:应用程序 --- Subject --- SecurityManager --- Realm 安全数据
            // 登录成功
            // 用户信息保存在session
            return SUCCESS;
        } catch (Exception e) {
            // 登录失败
            e.printStackTrace();
            return LOGIN;
        }
    }

    @Action(value = "user_logout",results = {@Result(type = "redirect",location = "login.html")})
    public String logout(){
        // 基于shiro完成退出
        Subject subject = SecurityUtils.getSubject();
        subject.logout();

        return SUCCESS;
    }

五、自定义Realm

// 自定义的Realm,实现安全数据链接
@Service(value = "bosRealm")
public class BosRealm extends AuthorizingRealm {

    @Autowired
    private UserService userService;

    @Autowired
    private RoleService roleService;

    @Autowired
    private PermissionService permissionService;

    @Override
    // 授权...
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection pc) {
        System.out.println("shiro 授权管理...");

        SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();

        // 根据当前登录用户查对应角色和权限
        Subject subject = SecurityUtils.getSubject();
        User user = (User) subject.getPrincipal();

        // 调用业务层,查询角色
        List roles = roleService.findByUser(user);
        for (Role role : roles){
            authorizationInfo.addRole(role.getKeyword());
        }

        // 调用业务层,返回权限
        List permissions = permissionService.findByUser(user);
        for (Permission permission : permissions) {
            authorizationInfo.addStringPermission(permission.getKeyword());
        }

        return authorizationInfo;
    }

    @Override
    // 认证...
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        System.out.println("shiro 认证管理...");

        // 转换token
        UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;

        // 根据有用户查询用户信息
        User user = userService.findByUsername(usernamePasswordToken.getUsername());

        if (user == null) {
            // 用户名不存在
            // 参数一:期望登录后,保存在Subject中信息
            // 参数二:密码,如果返回为null,说明用户不存在
            // 参数三:realm名称
            return null;
        } else {
            // 用户名存在
            // 当返回用户密码时,securityManager安全管理器,自动比较返回密码和用户输入密码是否一致
            // 如果一致 登录成功,如果密码不一致 报密码错误异常
            return new SimpleAuthenticationInfo(user, user.getPassword(), getName());
        }
    }
}

六、Shiro登录异常

用户名不存在:

org.apache.shiro.authc.UnknownAccountException
密码不正确
org.apache.shiro.authc.IncorrectCredentialsException: 
Submitted credentials for token 
[org.apache.shiro.authc.UsernamePasswordToken - admin, rememberMe=false] 
did not match the expected credentials.
相关TAG标签
上一篇:java发送邮件(代码教程)
下一篇:Boolan STL与泛型编程
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站