为了账号安全,请及时绑定邮箱和手机立即绑定

Java 两种方式的角色管理

Java 两种方式的角色管理

MYYA 2021-10-28 14:49:51
我正在设计一些具有用户和团队的 Java 应用程序:public abstract class AbstractUser()public class BasicUser extends AbstractUser()public class AnotherUser extends AbstractUser()现在我有包含用户的团队:public abstract class AbstractTeam() {  protected List<AbstractUser> members;}public class PublicTeam extends AbstractTeam()现在我需要管理团队,所以每个用户都应该有一个团队状态,例如成员、版主、管理员、所有者等。于是想到做一些接口:public Interface TeamRolepublic Interface Member extends TeamRolepublic Interface Moderator extends TeamRole并让 AbsractUser 类实现 TeamRole:public abstract class AbstractUser implements TeamRole现在我想做的是:让一个控制器来处理删除用户创建的条目:public boolean deleteEntry(User u, Entry e, requestingUser r) {}如何获得干净的表示,以便我可以执行以下操作:u.getEntries().removeIf(entry -> entry.equals(e));在不“尝试”if 语句中的所有角色的情况下以一种干净的方式?更新:这听起来可能不太“好”,但这只是为了描述执行操作时检查权限的问题
查看完整描述

3 回答

?
繁花不似锦

TA贡献1851条经验 获得超4个赞

首先,充满鳗鱼的气垫船正确地说AbstractUser应该组合TeamRole而不是继承它(因为它是“有”关系而不是“是”关系)。


现在到手头的问题。我不确定我是否完全理解您的要求,但是我假设您是在询问如何在AbstractUser不使用iforswitch语句进行检查的情况下检查是否具有执行操作的权限(或权限)。如果是这样,那么这里有一种方法(在我能想到的几种方法中)。创建一个Enum权限级别,每个权限级别都有一个与权限级别直接相关的序数。下面是一个基本的例子:


class enum PermissionLevel {

    MEMBER(0),

    MODERATOR(1)


    private final int level;


    PermissionLevel(int level) {

        this.level = level; 

    }


    public int getLevel() {

        return level;

    }

}

现在给TeamRole接口一个返回与该角色关联的权限级别的方法


public Interface TeamRole {

    PermissionLevel getPermissionLevel();


    ...

}

现在,检查时,如果一个成员有权所有你需要做的是对的权限级别的整数比较TeamRole的AbstractUser了。


if (user.getTeamRole().getPermissionLevel().getLevel() > PermissionLevel.MEMBER.getLevel()) {

    // User has permission to do this action

}


查看完整回答
反对 回复 2021-10-28
?
胡说叔叔

TA贡献1804条经验 获得超8个赞

我知道已经有了答案,但我想我可以分享一个不同的想法,我们将使用继承来表达角色层次结构和方法签名来约束操作。

这是一般的设计思路:

//img1.sycdn.imooc.com//617a48350001588e03040327.jpg

用法:


public class TeamApplicationService {

    public void doSomethingSpecial(final String teamId) {

        final Team team = teamRepository.teamOfId(teamId);

        final TeamModerator moderator = team.findModerator(currentUserId);

        team.doSomethingSpecial(moderator);

    }

}



public class Team {

    final Map<String, TeamMember> teamMembers;


    public Team() {

        teamMembers = new HashMap<String, TeamMember>();

    }


    public void addMember(final TeamMember member) {

        teamMembers.put(member.userId(), member);

    }


    private <T> T findMemberOfRole(final Class<T> clazz, final String userId) {


        if (!teamMembers.containsKey(userId)) throw couldNotFindMember();


        try {   

            return (T)clazz.cast(teamMembers.get(userId));

        } catch (java.lang.ClassCastException e) {

            throw couldNotFindMember();

        }

    }


    private RuntimeException couldNotFindMember() {

        return new RuntimeException("Could not find member");

    }


    public TeamModerator findModerator(final String userId) {

        return this.<TeamModerator>findMemberOfRole(TeamModerator.class, userId);

    }


    public TeamMember findMember(final String userId) {

        return this.<TeamMember>findMemberOfRole(TeamMember.class, userId);

    }



    public void doSomethingSpecial(TeamModerator moderator) {

        //Moderator only

    }


    public void doSomethingGeneral(TeamMember member) {

        //Any member

    }

}

编辑:我不完全确定要求,但这里有一个基于评论的更复杂的例子。


查看完整回答
反对 回复 2021-10-28
?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

TeamRole 成为删除策略(也许重命名?)。可以使用更多的重构,但我认为一般的想法会奏效。如果我们有更多的角色,我们可以添加更多的类并实现它们如何处理删除。


public class Entry{

}


public class User extends AbstractUser{

}


public abstract class AbstractUser {

    TeamRole role;

    List<Entry> entries;


    //self deletes are always ok

    public void deleteEntry(Entry e){

        this.getEntries().removeIf(entry -> entry.equals(e));

    }


    //delete depending on requested user role

    public void deleteEntry(User requestBy, Entry e){

            role.delete(this, e, requestBy);//mod or other poeple with ability to delete.

    }


    public List<Entry> getEntries() {

        return entries;

    }

};


public class BasicUser extends AbstractUser {

};


public class AnotherUser extends AbstractUser {

};


public abstract class AbstractTeam {

    protected List<AbstractUser> members;

}


public class PublicTeam extends AbstractTeam {

};


public interface TeamRole{

    public void delete(AbstractUser user, Entry entry, User requester);

}


public class Member implements TeamRole{

    @Override

    public void delete(AbstractUser user, Entry entry, User requester) {

        if(user==requester) {

            user.deleteEntry(entry);

        }

    }

}


public class Moderator implements TeamRole{

    @Override

    public void delete(AbstractUser user, Entry entry, User requester) {

        user.deleteEntry(entry);

    }

}


查看完整回答
反对 回复 2021-10-28
  • 3 回答
  • 0 关注
  • 247 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信