package com.yunlu.demo;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.cas.CasAuthenticationException;
import org.apache.shiro.cas.CasRealm;
import org.apache.shiro.cas.CasToken;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.subject.SimplePrincipalCollection;
import org.apache.shiro.util.CollectionUtils;
import org.jasig.cas.client.authentication.AttributePrincipal;
import org.jasig.cas.client.validation.Assertion;
import org.jasig.cas.client.validation.TicketValidationException;
import org.jasig.cas.client.validation.TicketValidator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.Assert;
//import org.springframework.transaction.annotation.Transactional;
/*import com.ld.nhmz.ebo.SusRoleEntity;
import com.ld.nhmz.ebo.SusUserEntity;
import com.ld.nhmz.service.SusRolePermissionService;
import com.ld.nhmz.service.SusRoleService;
import com.ld.nhmz.service.SusUserService;*/
//@Service
@SuppressWarnings("deprecation")
//@Transactional(value = "nhmzTM")
public class MzCasRealm extends CasRealm {
/* @Autowired
private SusUserService userService;
@Autowired
private SusRolePermissionService rolePermissionService;
@Autowired
private SusRoleService roleService;*/
private Logger log = LoggerFactory.getLogger(MzCasRealm.class);
private TicketValidator ticketValidator;
private HttpServletRequest request;
protected TicketValidator ensureTicketValidator()
{
if(ticketValidator == null)
ticketValidator = createTicketValidator();
return ticketValidator;
}
/* *//**
* 授权访问控制,用于对用户进行的操作进行人证授权,证明该用户是否允许进行当前操作,如访问某个链接,某个资源文件等
*//*
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
String username = (String) principals.getPrimaryPrincipal();
// SusUserEntity user = userService.findByUsername(username);
System.out.println("doGetAuthorizationInfo");
User user=new User();
user.setAccount("confadmin");
user.setPassword("yw123456");
if (user != null) {
SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
// 设置用户的角色
//String roleId = userService.getRoleIdFromUserId(user.getId());
// SusRoleEntity roleEntity = roleService.getRole(roleId);
if (null != user)
//authorizationInfo.addRole(roleEntity.getRolecode());
// 设置用户对应的角色的权限集合
// List<String> permissons;
try {
//permissons = rolePermissionService.getPermissionIds2(roleId);
for (String permission : permissons) {
authorizationInfo.addStringPermission(permission);
}
} catch (Exception e) {
e.printStackTrace();
}
return authorizationInfo;
}
return null;
}
*//**
* 验证用户身份
*//*
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
return super.doGetAuthenticationInfo(token);
}*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) throws AuthenticationException {
CasToken casToken = (CasToken) authcToken;
if (authcToken == null)
return null;
String ticket = (String) casToken.getCredentials();
TicketValidator ticketValidator = ensureTicketValidator();
try
{
Assertion casAssertion = ticketValidator.validate(ticket, getCasService());
System.out.println(casAssertion);
AttributePrincipal casPrincipal = casAssertion.getPrincipal();
String userId = casPrincipal.getName();
log.debug("Validate ticket : {} in CAS server : {} to retrieve user : {}", new Object[] {
ticket, getCasServerUrlPrefix(), userId
});
Map<String, Object> attributes = casPrincipal.getAttributes();
casToken.setUserId(userId);
String rememberMeAttributeName = getRememberMeAttributeName();
String rememberMeStringValue = (String)attributes.get(rememberMeAttributeName);
boolean isRemembered = rememberMeStringValue != null && Boolean.parseBoolean(rememberMeStringValue);
if(isRemembered)
casToken.setRememberMe(true);
/** 此处是封装用户信息
sUsr su = new sUsr();
su.setUsrCde(userId);
sUsr susr = isUsrService.findByCode(su);
AccessTokenInfo atInfo = new AccessTokenInfo();
atInfo.setUsrCde(userId);
//获取apikey
AccessTokenInfo ati = accessTokenInfoService.selectOneByObject(atInfo);
//构建ShiroUserAccount
ShiroUserAccount sua = new ShiroUserAccount(susr,ati);
*/
User user=new User();
user.setAccount("confadmin");
user.setPassword("yw123456");
List<Object> principals = CollectionUtils.asList(new Object[] {
user, attributes
});
PrincipalCollection principalCollection = new SimplePrincipalCollection(principals, getName());
return new SimpleAuthenticationInfo(principalCollection, ticket);
}
catch(TicketValidationException e)
{
throw new CasAuthenticationException((new StringBuilder()).append("Unable to validate ticket [").append(ticket).append("]").toString(), e);
}
}
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principal) {
/*SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();*/
//获取登录用户的Shiro对象 ---主体身份信息(验权)
/*
User shiroUser = (User)principal.getPrimaryPrincipal();
request.getSession().setAttribute("current_user", shiroUser);
//断言,若对象为空则直接抛出异常
Assert.notNull(shiroUser,"找不到principal中的SessionVariable---shiroUser");*/
//添加用户拥有的role
/*addRoles(info,shiroUser);
addPermissions(info,shiroUser);*/
String userName = (String)principal.getPrimaryPrincipal();
System.out.println(userName);
// User user = userService.getUserByUserName (userName );
SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
/* authorizationInfo.setRoles(userService.findRolesByUserId(user.getId()));
authorizationInfo.setStringPermissions(userService.findPermissionsByUserId(user.getId()));*/
return authorizationInfo;
// return info;
}
@Override
public void clearCachedAuthorizationInfo(PrincipalCollection principals) {
super.clearCachedAuthorizationInfo(principals);
}
@Override
public void clearCachedAuthenticationInfo(PrincipalCollection principals) {
super.clearCachedAuthenticationInfo(principals);
}
@Override
public void clearCache(PrincipalCollection principals) {
super.clearCache(principals);
}
public void clearAllCachedAuthorizationInfo() {
getAuthorizationCache()